ASP.NET Core 3.1中向ObjectCountViewModel列表添加求和值时Linq Sum报错的解决咨询
问题分析与解决方案
首先,咱们拆解下你遇到的错误:'IEnumerable' does not contain a definition for 'Sum' 这个提示的核心问题是——你调用Sum()的对象是对象集合(比如IEnumerable<YourMainObject>),而不是IEnumerable<decimal>这种数值类型的序列。Sum()方法需要直接作用于数值序列,所以必须先把要求和的decimal字段从对象里提取出来。
结合你之前的计数逻辑,咱们先优化原有代码(顺便提升性能),再给出正确的求和写法:
步骤1:优化原有计数逻辑(可选,但更高效)
原来的计数代码用Count()>0可以换成Any(),因为Any()只要找到符合条件的项就会停止遍历,比遍历全部项的Count()性能更好:
int itemsToCount = objects.Count(e => e.ObjectItems.Any(ep => ep.ObjectItemType.Description.Contains("ItemToCount") && ep.ObjectItemSelctionType.Description.Contains("Taken") ) ); objectCounts.Add(new ObjectCountViewModel() { Description = "Items Counted", Count = itemsToCount });
步骤2:正确实现求和逻辑
假设你要对符合条件的ObjectItem中的某个decimal属性(比如ep.Amount,请替换成你实际要计算的字段)求和,代码应该这样写:
// 1. 先展开所有主对象的ObjectItems,筛选出符合条件的项,再对目标字段求和 decimal totalSum = objects .SelectMany(e => e.ObjectItems) // 把每个主对象的ObjectItems集合展开成扁平列表 .Where(ep => ep.ObjectItemType.Description.Contains("ItemToCount") && ep.ObjectItemSelctionType.Description.Contains("Taken") ) .Sum(ep => ep.Amount); // 替换成你实际要求和的decimal属性 // 2. 将求和结果添加到ViewModel列表 objectCounts.Add(new ObjectCountViewModel() { Description = "Total Sum", Count = totalSum });
为什么原来的写法会报错?
如果你之前尝试的代码类似objects.Where(...).Sum(),问题就出在:Where(...)返回的是IEnumerable<YourMainObjectType>(对象集合),而不是数值序列。Sum()没有直接作用于对象集合的重载,所以必须先用Select或SelectMany提取出要计算的decimal字段,生成IEnumerable<decimal>序列后,才能调用Sum()。
额外场景提示
如果你的求和逻辑是每个符合条件的主对象对应一个数值,再对这些数值求和(而非展开ObjectItem求和),代码可以改成:
decimal totalSum = objects .Where(e => e.ObjectItems.Any(ep => ep.ObjectItemType.Description.Contains("ItemToCount") && ep.ObjectItemSelctionType.Description.Contains("Taken") ) ) .Sum(e => e.TotalAmount); // 替换成主对象上的decimal属性
内容的提问来源于stack exchange,提问作者jimd12
相关产品推荐
相关产品推荐

