在实体框架中选择前5名

fis*_*hie 60 c# entity-framework

我有

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname
Run Code Online (Sandbox Code Playgroud)

每个人都可以拥有0-*OnlineAccount.

在使用C#的实体框架中,如何选择帐户最多的前5人?

Luk*_*Led 135

试试这个:

var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);
Run Code Online (Sandbox Code Playgroud)

这回来了IQueryable<Person>.它还没有返回结果,因为它实现了延迟执行.它将被翻译为SQL并在需要时执行:

var metarializedItems = items.ToList(); // ToList forces execution
Run Code Online (Sandbox Code Playgroud)

要么

foreach(var item in items) // foreach forces execution
Run Code Online (Sandbox Code Playgroud)

上面的示例将转换为与此类似的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
Run Code Online (Sandbox Code Playgroud)

它不是这个确切的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.这是实体框架的力量.它将.NET表达式转换为SQL.

  • @MatthewPK:我不知道如何为你提供服务:)请使用SQL profiler并检查.你会看到从数据库中只取出5行:) (4认同)