2010-04-16 96 views
40

选择前5我有在实体框架

[Person] 
PersonID, EmailAddress, FirstName, LastName 

[OnlineAccount] 
OnlineAccountID, PersonID, Nickname 

每个人允许有0- * OnlineAccount。

在C#的实体框架中,如何选择拥有大部分帐户的前5位的人?

回答

93

试试这个:

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的强大功能。它将.NET表达式转换为SQL。

+0

这实际上最终会成为对数据库的SELECT TOP 5 ...查询吗? – 2011-11-22 13:49:46

+0

@彼得·里尔沃尔德:是的。在查询执行中只需要5行。 – LukLed 2011-11-22 16:15:40

+0

@LukLed你确定吗?你的意思是EF在IEnumerable扩展方法处理之前没有完成它的执行?我不知道这是真的...... – Matthew 2012-05-04 19:54:22