我在 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/