选择实体框架中的前5名


76

我有

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

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

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

Answers:


160

尝试这个:

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。


这实际上是否最终将作为SELECT TOP 5...对数据库的查询?
Peter Lillevold 2011年

@Peter Lillevold:是的。查询执行仅需5行。
LukLed 2011年

4
@MatthewPK:我不确定如何为您服务:)请使用SQL事件探查器进行检查。您只会看到从数据库中提取的5行:)
LukLed 2012年

1
@LukLed与LinqPad确认了+1!
马修

1
太棒了
恐怕要不
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.