C# 使用Qroupped数据中的linq的条件平均值不返回任何结果
我正在使用linq计算数据中一个字段的平均值。我希望将结果按其他两个字段分组C# 使用Qroupped数据中的linq的条件平均值不返回任何结果,c#,linq,group-by,where,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
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查询以获得正确的数据
编辑:一些问题和评论的答案
“Field1”在real live中还有3以外的其他值。这恰好是我此时的测试数据。听起来好像有些组没有任何满足
Where
条件的项目。不可为空值序列的平均值
不是零-这是一个例外。例如,Field1
和6
中没有Field3
大于零的项
我注意到在您的“我想要什么”表中,您只有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?
或与您的数据匹配的任何内容)我很好奇如何使用带平均值的可空值克服序列问题?我可能需要去看看资料来源。好的,找到了。今天学到了一些新东西,谢谢。@Nkosi或查看文档;与“值序列的平均值,如果源序列为空或仅包含空值,则为空。”与“值序列的平均值”形成对比。记录的异常为“InvalidOperationException源不包含任何元素”。@Nkosi btw;现在你最好使用corefx源代码:谢谢你的提示。基本上有另一个链接作为快速书签,可以快速查找api参考源。