Mar*_*ala 3 c# linq group-by where
我正在使用 linq 计算数据中一个字段的平均值。我想让我的结果按其他两个字段分组。
var Table3 = from d in table1sum.Concat(table2sum)
group d by new { d.Field1, d.Field2 } into dg
let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => g.Field3)
let Field4Sum = dg.Sum(g => g.Field4)
let Field5Sum = dg.Sum(g => g.Field5)
let Field6Sum = dg.Sum(g => g.Field6)
select new
{
SupplierID = dg.Key.Field1,
PropertyID = dg.Key.Field2,
AverageField3,
Field4Sum,
Field5Sum,
Field6Sum
};
Run Code Online (Sandbox Code Playgroud)
原始数据为
Table1Sum
Field1 |Field2 |Field3 |Field4 |Field5 |Field6
3 |3 |48,00 |3019,00 |603,80 |0,00
3 |4 |51,00 |3144,00 |628,80 |0,00
3 |5 |49,00 |3085,00 |617,00 |0,00
3 |5 |49,00 |3062,00 |612,40 |0,00
3 |7 |30,00 |42,00 |8,40 |0,00
Table2Sum
Field1 |Field2 |Field3 |Field4 |Field5 |Field6
6 |4 |0,00 |0,00 |0,00 |959,80
4 |7 |0,00 |0,00 |0,00 |529,25
1 |3 |0,00 |0,00 |0,00 |1730,45
1 |7 |0,00 |0,00 |0,00 |2127,21
2 |5 |0,00 |0,00 |0,00 |239,63
1 |5 |0,00 |0,00 |0,00 |867,23
6 |3 |0,00 |0,00 |0,00 |501,20
2 |3 |0,00 |0,00 |0,00 |354,63
3 |4 |0,00 |0,00 |0,00 |541,54
3 |3 |0,00 |0,00 |0,00 |683,85
6 |5 |0,00 |0,00 |0,00 |511,73
4 |5 |0,00 |0,00 |0,00 |1023,17
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我收到错误“序列不包含元素”。
我想要的是
Table3
Field1 |Field2 |Field3 |Field4 |Field5 |Field6
3 |3 |48,00 |3019,00 |603,80 |683,85
3 |4 |51,00 |3144,00 |628,80 |541,54
3 |5 |49,00 |6147,00 |1229,40 |0,00
3 |7 |30,00 |42,00 |8,40 |0,00
Run Code Online (Sandbox Code Playgroud)
如何更改我的 linq 查询以获得正确的数据?
编辑:问题和评论的一些答案。
'Field1' 在现实生活中还有其他值而不是 3。这恰好是我此时的测试数据。
听起来有些组没有任何满足Where条件的项目。在Average不可为空值的空序列是不为零-这是一个例外。例如,有没有物品可Field1为6具有Field3大于零。
我注意到在你的“我想要的”表中你只有Field1as的值3- 如果这代表你的真实场景,也许过滤第二个表。
一个可能的解决方法是将值投影为可为空:
let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => (int?)g.Field3)
Run Code Online (Sandbox Code Playgroud)
null当没有任何输入时,这将给出一个值。如果你想要零:
let AverageField3 = dg.Where(g => g.Field3 > 0.0)
.Average(g => (int?)g.Field3)
.GetValueOrDefault();
Run Code Online (Sandbox Code Playgroud)
(替换int?用float?或decimal?或不管它是你的数据相匹配)