我有
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每个人都可以拥有0- * OnlineAccount。
在使用C#的实体框架中,如何选择拥有最多帐户的前5名人员?
Answers:
尝试这个:
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...
对数据库的查询?