我使用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
};
原始数据
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
出于某种原因,我得到错误"序列不包含任何元素"。
我想要的是
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
如何更改我的linq查询以获取正确的数据?
编辑:问题和评论的一些答案。
'字段1'实际上还有其他值而不是3.这恰好是我此时的测试数据。
答案 0 :(得分:4)
听起来有些团体没有任何物品满足Where
条件。空的非可空值序列的Average
不为零 - 这是一个例外。例如,Field1
的{{1}}没有6
的项Field3
大于零。
我注意到你的#34;我想要什么"表格只有Field1
为3
的值 - 如果这代表您的真实情况,可能会过滤第二个表格。
可能的解决方法是将值投影为可为空的:
let AverageField3 = dg.Where(g => g.Field3 > 0.0).Average(g => (int?)g.Field3)
如果没有任何输入,这将给出null
值。如果你想要零:
let AverageField3 = dg.Where(g => g.Field3 > 0.0)
.Average(g => (int?)g.Field3)
.GetValueOrDefault();
(将int?
替换为float?
或decimal?
或与您的数据匹配的任何内容)