c# - 在 Entity Framework 中选择前 5 名

标签 c# entity-framework

我有

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

每个人允许拥有 0-* 在线账号。

在使用 C# 的 Entity Framework 中,如何选择拥有最多帐户的前 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。

关于c# - 在 Entity Framework 中选择前 5 名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656576/

相关文章:

javascript - 除非在网格上单击下一行,否则值不会绑定(bind)到下拉提供程序

c# - Visual Studio 2015 智能感知在调试期间未出现

c# - 具有大型 .Any() 的 Entity Framework 6 中的 LINQ

sql-server - 所有实体都继承自一个主基表的优缺点是什么?

c# - 如何将相对路径转换为 ​​C#/.NET 中的完全限定路径?

c# - 等待大量任务

postgresql - Entity Framework Core 中的每个操作排序规则

entity-framework - 带有列表的 Entity Framework 复杂对象

c# - 在存储库中模拟 DbSet<TEntity>

c# - 如何使用 C# 在系统范围内禁用鼠标单击事件?