使用LINQ对分组数据求条件平均值返回空值的问题修正
解决LINQ分组计算平均值时的“Sequence contains no elements”错误
你遇到的问题根源很明确:当某个分组里没有任何Field3 > 0.0的元素时,Average()方法因为空序列直接抛出了异常——比如你Table2Sum里那些Field3全为0的独立分组,就会触发这个错误。
要修复这个问题,我们只需要在计算平均值前先判断序列是否为空,或者给空序列一个默认值,下面提供两种可行的修改方案:
方案1:使用DefaultIfEmpty()给空序列兜底
这种方式会在没有有效数据时,用double的默认值0.0来计算平均值,代码简洁直接:
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).DefaultIfEmpty().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 };
方案2:显式判断序列是否为空(更灵活)
如果你需要区分“没有有效Field3数据”的场景(比如返回null而不是0.0),可以先提取有效数据再判断:
var Table3 = from d in table1sum.Concat(table2sum) group d by new { d.Field1, d.Field2 } into dg let validField3Entries = dg.Where(g => g.Field3 > 0.0) // 这里可以根据需求修改默认值,比如改成null则需要把AverageField3设为double?类型 let AverageField3 = validField3Entries.Any() ? validField3Entries.Average(g => g.Field3) : 0.0 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 };
补充说明
两种方案都能解决你的异常问题,同时保证其他字段的总和计算不受影响。如果你的业务场景中需要对“无有效Field3数据”的情况做特殊处理(比如标记为N/A),方案2会更适合,只需要调整默认值的逻辑即可。
内容的提问来源于stack exchange,提问作者Markku Rintala
相关产品推荐
相关产品推荐

