在一个LINQ查询中获取两列的总和

Axa*_*dax 60 .net c# linq sum linq-to-sql

假设我有一个名为Items的表(ID int,Done int,Total int)

我可以通过两个查询来完成:

int total = m.Items.Sum(p=>p.Total)
int done = m.Items.Sum(p=>p.Done)
Run Code Online (Sandbox Code Playgroud)

但我想在一个查询中执行此操作,如下所示:

var x = from p in m.Items select new { Sum(p.Total), Sum(p.Done)};
Run Code Online (Sandbox Code Playgroud)

当然有一种方法可以从LINQ语法中调用聚合函数......?

Ste*_*ven 86

这样就可以了:

from p in m.Items
group p by 1 into g
select new
{
    SumTotal = g.Sum(x => x.Total), 
    SumDone = g.Sum(x => x.Done) 
};
Run Code Online (Sandbox Code Playgroud)

  • 或者当Item没有唯一标识符时,您可以将"p p by p"写入g`. (11认同)
  • 这个答案是不正确的 - 如果您按项目上的唯一标识符进行分组,那么您将仅对单个项目求和.然后结果将是可枚举的匿名类型,其中包含与Items中的行一样多的元素.@WhoIsNinja是对的 - 您需要使用常量进行分组. (2认同)

Who*_*nja 10

要对表进行求和,请按常量分组:

from p in m.Items
group p by 1 into g
select new {
    SumTotal = g.Sum(x => x.Total),
    SumDone = g.Sum(x => x.Done)
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 9

怎么样

   m.Items.Select(item => new { Total = item.Total, Done = item.Done })
          .Aggregate((t1, t2) => new { Total = t1.Total + t2.Total, Done = t1.Done + t2.Done });
Run Code Online (Sandbox Code Playgroud)


小智 6

弄清楚在我的其余代码中提取总和或其他聚合的位置使我感到困惑,直到我记得我构造的变量是一个Iqueryable.假设我们的数据库中有一个由Orders组成的表,我们想为ABC公司生成一个摘要:

var myResult = from g in dbcontext.Ordertable
               group p by (p.CUSTNAME == "ABC") into q  // i.e., all of ABC company at once
               select new
{
    tempPrice = q.Sum( x => (x.PRICE ?? 0m) ),  // (?? makes sure we don't get back a nullable)
    tempQty = q.Sum( x => (x.QTY ?? 0m) )
};
Run Code Online (Sandbox Code Playgroud)

现在有趣的部分 - tempPrice和tempQty没有在任何地方声明,但它们必须是myResult的一部分,不是吗?访问它们如下:

Console.Writeline(string.Format("You ordered {0} for a total price of {1:C}",
                                 myResult.Single().tempQty,
                                 myResult.Single().tempPrice ));
Run Code Online (Sandbox Code Playgroud)

还可以使用许多其他可查询方法.