我有以下一些代码,当没有找到数据时会导致异常。
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;
但现在这不会编译错误:
运营商' ??'不能应用于十进制'类型的操作数和'十进制'
答案 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)