我有一个包含以下代码行的大型实体框架查询。
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
当我将数据具体化时,出现以下错误:
类型转换为“Decimal”值类型失败,因为被具体化的值为空。结果类型的泛型参数或查询必须使用可空类型。
如果我按如下方式更改查询(添加两个类型转换),则错误消息消失了。
var programs = from p in Repository.Query<Program>()
where p.OfficeId == CurrentOffice.Id
let totalCharges = (decimal?)p.ProgramBillings.Where(b => b.Amount > 0 && b.DeletedDate == null).Select(b => b.Amount).Sum()
let totalCredits = (decimal?)p.ProgramBillings.Where(b => b.Amount < 0 && b.DeletedDate == null).Select(b => -b.Amount).Sum()
let billingBalance = (totalCharges - totalCredits)
我不理解这个问题。 ProgramBilling.Amount
是一个非空的十进制数。如果我将鼠标悬停在 Sum()
调用上方,Intellisense 会显示它返回类型 Decimal。但是其他测试证实,在我的第二个版本中,当 ProgramBillings
没有数据时,totalCharges
和 totalCredits
都被设置为 null。
问题:
我知道
Sum()
对于空集合返回 0。但是在什么情况下这不成立?如果有时不成立,那么为什么当我将鼠标悬停在
Sum()
上方时,Intellisense 显示它返回类型 Decimal 而不是 Decimal?看起来 Intellisense 和我的理解是一致的。
编辑:
似乎有一个简单的解决方法,就是使用类似于 Sum() ?? 0m
的方法。但是这是非法的,会给我带来错误:
运算符“??”不能应用于类型为“decimal”和“decimal”的操作数
Select
后添加一个DefaultIfEmpty(0)
,然后再加上Sum
。现在如果你有一个空集合,你将得到0
,而 0 的总和当然是 0。 - Matt Burland