在entity framework中select前5名
我有
[Person] PersonID, EmailAddress, FirstName, LastName [OnlineAccount] OnlineAccountID, PersonID, Nickname
每个人都被允许有0- * OnlineAccount。
在使用C#的entity framework中,如何select拥有最多账户的前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的力量。 它将.NETexpression式转换为SQL。