2012-10-05 99 views
0

构建linq语句(C#,查询语法,但我可以处理方法sytax)有点麻烦。它需要支持分组以及公开计算的属性。我对每个人都有处理,但不能让他们似乎一起工作。任何帮助,将不胜感激。linq通过组计算值

数据

GrpField   Qty  Price 
-------------  ---  ----- 
RED    1  10 
RED    2  10 
RED    1  50 
BLUE    2  30 
BLUE    2  50 

输出需要为每个组

所需的结果

RED 80 
BLUE 160 

这让我总有总价格(数量*价格)的总和价格线

from x in origdata 
let linetotal = x.qty * x.price 
select new { x.grpfield, x.qty, x.price, linetotal } 

但我无法按新的匿名类型进行分组,因为您无法对匿名类型运行聚合类似的总和。如果我首先运行团队,那么我无法弄清楚如何在总和之前将总体工作量加入组合。

回答

3

由于贵像匿名类型声明总和,因为你无法运行聚集证据......

var data = new[] 
    { 
     new {GrpField = "RED", Qty = 1, Price = 10}, 
     new {GrpField = "RED", Qty = 2, Price = 10}, 
     new {GrpField = "RED", Qty = 1, Price = 50}, 
     new {GrpField = "BLUE", Qty = 2, Price = 30}, 
     new {GrpField = "BLUE", Qty = 2, Price = 50}, 
    }; 

var grouped = 
    from d in data 
    group d by d.GrpField 
    into g 
    select new {Group = g.Key, Sum = g.Sum(x => x.Qty * x.Price)}; 

foreach(var g in grouped) 
    Console.WriteLine("{0} - {1}", g.Group, g.Sum); 
+0

这说法是不是我的意见 - 这是编译器错误(并在MS文档中),如果你把我原来的查询,并尝试运行非匿名类型的组。诀窍(如你和其他答案所证明的)是首先完成该组。 – ktharsis

2

先组合,然后求和操作。

origdata.GroupBy(m => m.GrpField) 
.Select(group => new { 
    GrpField = group.Key, 
    CalculatedValue = group.Sum(m => m.qty * m.price) 
    }); 
1
origdata.GroupBy(p=>p.GrpField) 
.Select(p=> new() 
{ 
    GrpField=p=>p.Key, 
    Sum=p.Sum(q=>q.Qty*q.Price) 
})