LINQ查询中多列求和

5

我有这样一张表:统计(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),
});

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

更新 以下是两个执行计划:

enter image description here


2
我们无法告诉您它是否足够好。由您来判断。测量它。如果它对您而言表现良好,那么它就足够好。如果不是,您就知道它不够好。 - Servy
可能 [重复] (https://dev59.com/YXE95IYBdhLWcg3wKqok) - Max Brodin
2个回答

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

这个查询语句 SELECT SUM([Col1]), SUM([Col2]) FROM [dbo].[Statistics] 的计划是否与之前的相同? - DevT
我当然无法使用你的数据库测试查询。但是对于这样一个简单的查询,它应该生成相同的计划。 - Magnus

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;}
}

可以的,但这意味着LINQ在这种查询方面存在限制,我对此不太确定。 - DevT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接