【发布时间】:2015-01-09 18:29:31
【问题描述】:
我有一个包含这些行的大型实体框架查询。
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)
当我实现数据时,我收到以下错误:
转换为值类型“十进制”失败,因为具体化值为空。结果类型的泛型参数或查询必须使用可为空的类型。
如果我按如下方式更改我的查询(在两种类型转换中添加),错误就会消失。
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 会说它返回十进制类型。而另外的测试证实,在我的第二个版本中,totalCharges 和 totalCredits 对于ProgramBillings 没有数据的那些行都设置为空。
问题:
我知道
Sum()为空集合返回 0。在什么情况下这不是真的?如果有时这不是真的,那么为什么当我将鼠标悬停在
Sum()上时,Intellisense 会显示它返回类型 Decimal 而不是 Decimal?看来 Intellisense 的理解和我一样。
编辑:
似乎一个简单的解决方法是执行Sum() ?? 0m 之类的操作。但这是非法的,给我错误:
运算符'??'不能应用于“十进制”和“十进制”类型的操作数
【问题讨论】:
-
@JonathanWood:“但我仍然对为什么这是必要的感到困惑”再次阅读链接问题的标题。这是必要的,因为集合是空的。如果不为空,您希望空集合的总和是多少?显然,
0并没有削减它,因为0是一个完全有效的总和值。 -
@DavidTansey:我确实看到了,但它没有提供关于我在问题末尾提出的任何一个问题的任何线索。这是我将根据需要采取的方法。只是想了解原因。
-
在
Select之后,在Sum之前添加DefaultIfEmpty(0),尝试接受的答案中的内容。现在,如果您有一个空集合,您将得到0,0 的总和当然是 0。 -
@MattBurland:正如我在别处指出的那样,我希望空集合的总和为 0。显然,Intellisense 和我一样认为 Sum() 永远不会返回 null。
Cleary 0 doesn't cut it since 0 is a perfectly valid value for a sum好吧,如果 0 是一个完全有效的求和值,那么为什么 0 不削减呢?
标签: c# linq entity-framework