在构造linq语句时遇到一些麻烦(C#,查询语法,但我可以处理方法sytax)。它需要支持分组以及公开计算属性。我对每个单独处理,但不能使它们似乎一起工作。任何帮助将不胜感激。
数据
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 }
但我无法按新的匿名类型进行分组,因为您无法在匿名类型上运行sum这样的聚合。如果我首先运行该组,我无法弄清楚如何在总和之前将linetotal用于混合。
答案 0 :(得分:4)
作为针对您的的证据,因为您无法在匿名类型语句上运行总和...
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);
答案 1 :(得分:2)
先分组,然后对操作求和。
origdata.GroupBy(m => m.GrpField)
.Select(group => new {
GrpField = group.Key,
CalculatedValue = group.Sum(m => m.qty * m.price)
});
答案 2 :(得分:1)
origdata.GroupBy(p=>p.GrpField)
.Select(p=> new()
{
GrpField=p=>p.Key,
Sum=p.Sum(q=>q.Qty*q.Price)
})