c# - 带有 ROW_NUMBER 的 SQL 查询在 LINQ 中效率不高

标签 c# sql-server linq

我在 SQL 中有这个查询:

SELECT * FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY p.category ORDER BY (
        SELECT AVG(CAST(r.users AS NUMERIC)) FROM description r WHERE r.company = p.id
    ) DESC)  AS rownb, p.* FROM company p 
) rs WHERE rownb <= 2

我将此查询转换为 LINQ 最远的是:

Companies
    .SelectMany(r => 
        Descriptions
            .GroupBy(t => t.Company)
            .Select(t => new { 
                Average = t.Average(a => (double)a.Users), 
                Company = t.Key })
            .OrderByDescending(t => t.Average)
        , (p, r) => new { Companies = p, Descriptions = r })
    .Where(t => t.Companies.Id == t.Descriptions.Company)
    .GroupBy(t => t.Companies.Category)
    .Select(t => t.Take(2))
    .SelectMany(t => t)
    .Select(t => new { t.Companies.Name, t.Descriptions.Average, t.Companies.Category})
    .OrderBy(t => t.Category)

但问题是性能。 SQL 查询成本为 28%(相对于批处理),而 LINQ 查询为 72%。

我已经用 LINQ 中的 SelectMany 替换了 Join,这降低了 20% 的成本。但是现在我不知道如何优化这个查询了。

另外,我知道 LINQ 中没有 ROW_NUMBER。

我正在使用 LINQPad 检查生成的 SQL 查询。

问题:ROW_NUMBER 是造成这种性能差异的原因吗?是否可以进一步优化 LINQ 查询?

最佳答案

您可以像这样在您的选择中模拟 row_number

.Select((t,i) => new { rowindex = i+1, t.Companies.Name, t.Descriptions.Average, t.Companies.Category})

至于优化,我不太确定。

关于c# - 带有 ROW_NUMBER 的 SQL 查询在 LINQ 中效率不高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31324960/

相关文章:

c# - 意外的 C# 警告 : instance member hides static method on base class

sql - 我下载了 mac os 的 mssql 工具,但它说 "sqlcmd: command not found"

sql-server - SQL Server 存储过程和 Linq-to-SQL

c# - 使用LINQ获取具有属性=另一个对象属性的对象

.net - Linq 到实体 : does not recognize the method

c# - 密码过期时如何在事件目录中更改密码

c# - 具有 Http 触发功能的连续 Azure WebJob

c# - 有人可以向我解释一下事件到底是什么以及与委托(delegate)有什么区别吗?

mysql - 如何从多个表中选择一个(或零个)条目,并将这些值添加在一起以匹配特定值?

类型之间的 Linq 转换