【发布时间】:2010-04-16 23:17:57
【问题描述】:
我有
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每个人都可以拥有0-*个OnlineAccount。
在使用 C# 的实体框架中,我如何选择拥有最多帐户的前 5 名人员?
【问题讨论】:
标签: c# entity-framework
我有
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每个人都可以拥有0-*个OnlineAccount。
在使用 C# 的实体框架中,我如何选择拥有最多帐户的前 5 名人员?
【问题讨论】:
标签: c# entity-framework
试试这个:
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 5。 OrderByDescending(u => u.OnlineAccounts.Count) 被翻译成ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC。这是实体框架的力量。它将 .NET 表达式转换为 SQL。
【讨论】:
SELECT TOP 5... 查询数据库吗?