C# 获取多个列的总和

C# 获取多个列的总和,c#,entity-framework,sum,C#,Entity Framework,Sum,我有三列,我试图得到返回的每一列的总和。我可以为一个专栏做这件事: var data = db.Test.Sum(x => x.Column1); 但是我不知道如何得到三列的总和。我试着把这些值选出来并求和,但那不起作用 var data = db.Test.Select(x=> new { x.Column1, x.Column3, x.Column3}).Sum(); 我要分别计算每一列的结果,而不是所有列的总和 var sums = db.Tests .GroupB

我有三列,我试图得到返回的每一列的总和。我可以为一个专栏做这件事:

var data = db.Test.Sum(x => x.Column1);
但是我不知道如何得到三列的总和。我试着把这些值选出来并求和,但那不起作用

var data = db.Test.Select(x=> new { x.Column1, x.Column3, x.Column3}).Sum();
我要分别计算每一列的结果,而不是所有列的总和

var sums = db.Tests
    .GroupBy(x => true)
    .Select(x => new 
    { 
        SumColumn1 = x.Sum(y => y.Column1), 
        SumColumn2 = x.Sum(y => y.Column2), 
        SumColumn3 = x.Sum(y => y.Column3) 
    });

GroupBy(x=>true)
语句将所有项放在一个组中。
Select
语句允许对每个组进行操作。在这种情况下,唯一的组是一组所有项目,允许我们返回每列的总和。

要获得三个不同列的总和,您需要将序列投影到该列,并在三个不同的时间获得总和:

var sum1 = db.Test.Sum(x => x.Column1);
var sum2 = db.Test.Sum(x => x.Column2);
var sum3 = db.Test.Sum(x => x.Column3);
要在单个DB请求中执行此操作,您可以在另一个查询的范围内执行这些投影:

var sums = db.Test.Take(1)
    .Select(unused => new
    {
        sum1 = db.Test.Sum(x => x.Column1),
        sum2 = db.Test.Sum(x => x.Column2),
        sum3 = db.Test.Sum(x => x.Column3),
    })
    .First();

把他们分开询问会更容易吗?是的,我可以。但我认为在DB上进行一次查询比3次性能查询更好。@Joseph尝试一下并找出答案。我希望如此,但这可能还不够麻烦。这将导致三个单独的
select sum
语句,导致执行时间比下面发布的单个GroupBy答案更长。@RobEpstein只要在到DB的一次往返中完成,我希望差异非常小。一次对3列求和并不比单独对3列求和更昂贵或更便宜。第一种选择当然有3次往返数据库;第二个选项消除了这个缺点。