40
選擇前5我有在實體框架
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每個人允許有0- * OnlineAccount。
在C#的實體框架中,如何選擇擁有大部分帳戶的前5位的人?
選擇前5我有在實體框架
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每個人允許有0- * OnlineAccount。
在C#的實體框架中,如何選擇擁有大部分帳戶的前5位的人?
試試這個:
var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
這將返回IQueryable<Person>
。它還沒有返回結果,因爲它實現了延期執行。它會被轉換爲SQL和需要時的執行:
var metarializedItems = items.ToList(); // ToList forces execution
或
foreach(var item in items) // foreach forces execution
實施例以上將轉化爲SQL類似於此:
SELECT TOP 5 p.PersonID, p.EmailAddress, p.FirstName, p.LastName
FROM Person p
ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
這不會是這確切的SQL。不同的EF版本可能產生不同的SQL,但我寫它來說明它的工作原理。 Take(5)
被翻譯爲TOP 5
。 OrderByDescending(u => u.OnlineAccounts.Count)
被翻譯爲ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
。這是Entity Framework的強大功能。它將.NET表達式轉換爲SQL。
這實際上最終會成爲對數據庫的SELECT TOP 5 ...查詢嗎? – 2011-11-22 13:49:46
@彼得·里爾沃爾德:是的。在查詢執行中只需要5行。 – LukLed 2011-11-22 16:15:40
@LukLed你確定嗎?你的意思是EF在IEnumerable擴展方法處理之前沒有完成它的執行?我不知道這是真的...... – Matthew 2012-05-04 19:54:22