在實體框架中選擇前5名

c# entity-framework

我有

[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 5OrderByDescending(u => u.OnlineAccounts.Count)被轉換為ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC 。這是實體框架的力量。它將.NET表達式轉換為SQL。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因