【问题标题】:select top 5 in entity framework在实体框架中选择前 5 名
【发布时间】:2010-04-16 23:17:57
【问题描述】:

我有

[Person]
PersonID, EmailAddress, FirstName, LastName

[OnlineAccount]
OnlineAccountID, PersonID, Nickname

每个人都可以拥有0-*个OnlineAccount。

在使用 C# 的实体框架中,我如何选择拥有最多帐户的前 5 名人员?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    试试这个:

    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。这是实体框架的力量。它将 .NET 表达式转换为 SQL。

    【讨论】:

    • 这实际上会以SELECT TOP 5... 查询数据库吗?
    • @Peter Lillevold:是的。查询执行只需要 5 行。
    • @MatthewPK:我不确定如何说服你:) 请使用 SQL 分析器并检查。您只会看到从数据库中获取的 5 行:)
    • @LukLed 与 LinqPad 确认,+1!
    • 太棒了。害怕不把他们都拉走就不会离开
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多