在LINQ的Sum方法中添加条件报错,如何正确实现该功能?
在Sum中添加条件的正确实现
你的代码报错是因为Sum方法要求委托返回数值类型(如int、decimal),但你写的i.VFApprovedFinalEffort && i.SpecialRates=="test"返回的是布尔值(bool),不符合Sum的参数要求。
下面是两种可行的修正方案:
方案1:先过滤再聚合
先通过Where筛选出满足条件的元素,再根据需求选择Count(统计数量)或Sum(求和字段值):
统计符合条件的元素数量
var vfgrandtotal = issues.Count(i => i.VFApprovedFinalEffort && i.SpecialRates == "test");
对符合条件的元素的VFApprovedFinalEffort字段求和
var vfgrandtotal = issues.Where(i => i.VFApprovedFinalEffort && i.SpecialRates == "test") .Sum(i => i.VFApprovedFinalEffort);
方案2:在Sum中转换为数值
用三元表达式把布尔条件转为数值,符合条件返回目标值(或1用于计数),不符合返回0:
统计符合条件的元素数量
var vfgrandtotal = issues.Sum(i => (i.VFApprovedFinalEffort && i.SpecialRates == "test") ? 1 : 0);
对符合条件的元素的VFApprovedFinalEffort字段求和
var vfgrandtotal = issues.Sum(i => (i.VFApprovedFinalEffort && i.SpecialRates == "test") ? i.VFApprovedFinalEffort : 0);
完整示例代码
假设你需要统计符合条件的元素数量,修正后的完整代码如下:
private async Task<CapabilityUtilizationPagedResultDto> GetCount(IEnumerable<CapabilityUtilizationDto> issues) { var vfgrandtotal = issues.Count(i => i.VFApprovedFinalEffort && i.SpecialRates == "test"); var vfmd = vfgrandtotal / 19; return new CapabilityUtilizationPagedResultDto { VFGrandTotal = vfgrandtotal, VFMd = vfmd }; }
如果VFApprovedFinalEffort是数值类型(如decimal),需要求和该字段的值,代码如下:
private async Task<CapabilityUtilizationPagedResultDto> GetCount(IEnumerable<CapabilityUtilizationDto> issues) { var vfgrandtotal = issues.Where(i => i.SpecialRates == "test") .Sum(i => i.VFApprovedFinalEffort); var vfmd = vfgrandtotal / 19; return new CapabilityUtilizationPagedResultDto { VFGrandTotal = vfgrandtotal, VFMd = vfmd }; }
内容的提问来源于stack exchange,提问作者maya
相关产品推荐
相关产品推荐

