C# 选择实体框架中的前5名

C# 选择实体框架中的前5名,c#,entity-framework,C#,Entity Framework,我有 每个人都可以拥有0-*OnlineAccount 在entity framework with C中,如何选择拥有最多帐户的前5名人员?尝试以下方法: [Person] PersonID, EmailAddress, FirstName, LastName [OnlineAccount] OnlineAccountID, PersonID, Nickname 这将返回IQueryable。它还没有返回结果,因为它实现了延迟执行。它将转换为SQL并在需要时执行: var items =

我有

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

在entity framework with C中,如何选择拥有最多帐户的前5名人员?

尝试以下方法:

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname
这将返回IQueryable。它还没有返回结果,因为它实现了延迟执行。它将转换为SQL并在需要时执行:

var items = context.PersonSet.OrderByDescending(u => u.OnlineAccounts.Count).Take(5);

上面的示例将转换为类似于此示例的SQL:

foreach(var item in items) // foreach forces execution

不会是这样的。不同的EF版本可能会产生不同的SQL,但我写它是为了说明它是如何工作的。Take5被翻译成前5名。OrderByDowningu=>u.OnlineAccounts.Count通过从OnlineAccount oa中选择Count*转换为ORDER,其中p.PersonID=oa.PersonID DESC。这是实体框架的威力。它将.NET表达式转换为SQL。

这是否会最终成为一个精选的前5名。。。查询数据库?@Peter Lillevold:是的。查询执行只需要5行。@MatthewPK:我不知道如何说服您:请使用SQL分析器检查。您将只看到数据库中的5行:@LukLed已与LinqPad确认,+1!令人惊叹的我害怕如果不把他们都拖走就走不了
foreach(var item in items) // foreach forces execution
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