40
选择前5我有在实体框架
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每个人允许有0- * OnlineAccount。
在C#的实体框架中,如何选择拥有大部分帐户的前5位的人?
选择前5我有在实体框架
[Person]
PersonID, EmailAddress, FirstName, LastName
[OnlineAccount]
OnlineAccountID, PersonID, Nickname
每个人允许有0- * OnlineAccount。
在C#的实体框架中,如何选择拥有大部分帐户的前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 5
。 OrderByDescending(u => u.OnlineAccounts.Count)
被翻译为ORDER BY (SELECT COUNT(*) FROM OnlineAccount oa WHERE p.PersonID = oa.PersonID) DESC
。这是Entity Framework的强大功能。它将.NET表达式转换为SQL。
这实际上最终会成为对数据库的SELECT TOP 5 ...查询吗? – 2011-11-22 13:49:46
@彼得·里尔沃尔德:是的。在查询执行中只需要5行。 – LukLed 2011-11-22 16:15:40
@LukLed你确定吗?你的意思是EF在IEnumerable扩展方法处理之前没有完成它的执行?我不知道这是真的...... – Matthew 2012-05-04 19:54:22