在entity framework中select前5名

我有

[Person] PersonID, EmailAddress, FirstName, LastName [OnlineAccount] OnlineAccountID, PersonID, Nickname 

每个人都被允许有0- * OnlineAccount。

在使用C#的entity framework中,如何select拥有最多账户的前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 。 这是entity framework的力量。 它将.NETexpression式转换为SQL。