LINQ查询中多列的总和

时间:2015-01-07 15:24:05

标签: c# linq linq-to-sql

我是这个表:统计数据(id int,col1 int,col2 int,col3 int ...) 我想得到col1值,col2值,col3值等的总和。 一个简单的SQL查询:

SELECT SUM([Col1]), SUM([Col2])
FROM [dbo].[Statistics]

但是在LINQ:

var val1 = db.Statistics.Sum(x => x.Col1);
var val2 = db.Statistics.Sum(x => x.Col2);
var val3 = db.Statistics.Sum(x => x.Col3);
...

以这种方式工作,但这会对数据库执行N次查询。我想只执行一个。我发现的唯一方法是:

var result = db.Statistics.GroupBy(x => 1).Select(x => new
{
   val1 = x.Sum(k => k.Col1),
   val2 = x.Sum(k => k.Col2),
   val3 = x.Sum(k => k.Col3),
});

它生成一个复杂的查询。 这是正常的吗?

更新 这些是2个执行计划:

enter image description here

2 个答案:

答案 0 :(得分:5)

在我的测试中,它生成一个相当简单的查询,生成的执行计划与没有GroupBy的查询相同

的LINQ:

var result = tblSystems.GroupBy (s => 1).Select (s => new
{
    val1 = s.Sum (x => x.fkInfoSubCatID),
    val2 = s.Sum (x => x.fkCompanyID),
    val3 = s.Sum (x => x.eventResult)
});

生成的SQL:

-- Region Parameters
DECLARE @p0 Int = 1
-- EndRegion
SELECT SUM([t1].[fkInfoSubCatID]) AS [val1], SUM([t1].[fkCompanyID]) AS [val2], SUM([t1].[eventResult]) AS [val3]
FROM (
    SELECT @p0 AS [value], [t0].[fkInfoSubCatID], [t0].[fkCompanyID], [t0].[eventResult]
    FROM [dbo].[tblSystem] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

执行计划: enter image description here

答案 1 :(得分:1)

一切都取决于你的情况。你绝对正确,那个生成的查询不是最好的,但你的数据库是否应该填补差异?作为选项,您可以编写和调用存储过程或原始查询:

var result = db.ExecuteQuery<Dto>("SELECT SUM([Col1]) AS Sum1, SUM([Col2]) AS Sum2 FROM [dbo].[Statistics]")

public class Dto
{
    public int Sum1{get;set;}
    public int Sum2{get;set;}
}