2010-04-16 133 views
40

選擇前5我有在實體框架

[Person] 
PersonID, EmailAddress, FirstName, LastName 

[OnlineAccount] 
OnlineAccountID, PersonID, Nickname 

每個人允許有0- * OnlineAccount。

在C#的實體框架中,如何選擇擁有大部分帳戶的前5位的人?

回答

93

試試這個:

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 5OrderByDescending(u => u.OnlineAccounts.Count)被翻譯爲ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC。這是Entity Framework的強大功能。它將.NET表達式轉換爲SQL。

+0

這實際上最終會成爲對數據庫的SELECT TOP 5 ...查詢嗎? – 2011-11-22 13:49:46

+0

@彼得·里爾沃爾德:是的。在查詢執行中只需要5行。 – LukLed 2011-11-22 16:15:40

+0

@LukLed你確定嗎?你的意思是EF在IEnumerable擴展方法處理之前沒有完成它的執行?我不知道這是真的...... – Matthew 2012-05-04 19:54:22