在一个LINQ查询中获取两列的总和而不进行分组

use*_*358 11 linq entity-framework linq-to-sql

我想在一个查询中总结一个表的三个不同字段.我想要这个T-SQL的linq等价物:

select sum(fld1), SUM(fld2),  SUM(fld3)   from MyTable where classID = 5
Run Code Online (Sandbox Code Playgroud)

我找到的所有示例要么使用group by,要么多次调用查询,对于需要总结的每个字段一次.

我现在有类似的东西.但是我不想为它添加group by子句,因为它在T-SQL表单中不是必需的.

from a in MyTable
where a.classID == 5
group a by a.classID into g
select new 
{
Sumfld1 =  g.Sum(x => x.fld1 ), 
Sumfld2 = g.Sum(x => x.fld2),
Sumfld3 = g.Sum(x => x.fld3)
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?谢谢你的时间.

Ger*_*old 12

事实证明,在linq-to-sql中你可以通过以下方式获得非常接近:

from a in MyTable
where a.classID == 5
group a by 0 into g
select new 
{
    Sumfld1 = g.Sum(x => x.fld1), 
    Sumfld2 = g.Sum(x => x.fld2),
    Sumfld3 = g.Sum(x => x.fld3)
}
Run Code Online (Sandbox Code Playgroud)

(注意组为0)

它不会转换为sql GROUP BY,而是转换为子查询中SELECT的多个SUMs.就执行计划而言,它甚至可能是相同的.

实体框架仍然会创建一个GROUP BY,尽管如此0.


小智 0

var x = from a in MyTable 
        where a.classID == 5 
        select a;

int? Sumfld1 = x.Sum(y => y.fld1);
int? Sumfld2 = x.Sum(y => y.fld2);
int? Sumfld3 = x.Sum(y => y.fld3);
Run Code Online (Sandbox Code Playgroud)

  • 看起来它会为每个 x.Sum(..) 调用 var X 中的查询,并尝试并报告。谢谢。 (2认同)