导致异常的空列表中的十进制总和

时间:2014-06-05 15:40:50

标签: c# linq sum decimal

我有以下一些代码,当没有找到数据时会导致异常。

decimal expectedAmount = salePayments.Where(x => x.PaymentTypeId == i).Select(x => x.Amount).Sum(x => x);

例外:

  

类型' System.InvalidOperationException'的例外情况发生在   System.Data.Entity.dll但未在用户代码中处理

     

其他信息:投射到价值类型'十进制'失败   因为物化值为空。结果类型' s   泛型参数或查询必须使用可空类型。

对SO的一些研究让我尝试了:

decimal? test = salePayments.Where(x => x.PaymentTypeId==i).Select(x => x.Amount).Sum(x => x) ?? 0m;

但现在这不会编译错误:

  

运营商' ??'不能应用于十进制'类型的操作数和'十进制'

2 个答案:

答案 0 :(得分:4)

您需要在x.Amount中明确地将Select投射到decimal?,然后才能使用空合并运算符。

decimal test = salePayments.Where(x => x.PaymentTypeId==i)
                            .Select(x => (decimal?) x.Amount).Sum(x => x) ?? 0m;

或者你可以回复decimal

decimal test = salePayments.Where(x => x.PaymentTypeId==i)
                            .Select(x => x.Amount ?? 0m).Sum(x => x);

我不确定,但您可以尝试直接应用Sum,例如:

decimal? test = salePayments.Where(x => x.PaymentTypeId==i)
                                .Sum(x => x.Amount);

根据documentation,,如果列表为空,则返回0。

答案 1 :(得分:0)

在.Sum

之前添加DefaultIfEmpty(0.0M)