我有一個包含這些行的大型實體框架查詢。Sum()在實體框架查詢中返回null
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)
當我兌現了數據,我得到以下錯誤:
The cast to value type 'Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.
如果我改變如下我的查詢(兩種類型轉換添加),錯誤消失。
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
是一個不可空的Decimal。如果我將鼠標懸停在Sum()
調用上,Intellisense說它返回Decimal類型。而另外的測試證實,在我的第二個版本中,對於ProgramBillings
沒有數據的那些行,totalCharges
和totalCredits
都設置爲空。
問題:
我明白
Sum()
一個空的集合返回0。在什麼情況下這是不正確的?如果有時候這不是真的,那麼爲什麼當我將鼠標懸停在
Sum()
上時,Intellisense顯示它返回類型Decimal而不是Decimal?看起來Intellisense和我有同樣的理解。
編輯:
這似乎是一個簡單的辦法是做這樣的事情Sum() ?? 0m
。但是,這是非法的,給我的錯誤:
Operator '??' cannot be applied to operands of type 'decimal' and 'decimal'
你看過這篇文章:http://stackoverflow.com/questions/17593371/how-to-force-linq-sum-to-return-0-while-source-collection-is-empty – 2015-01-09 18:33:52
@JonathanWood:「但我仍然對爲什麼這是必要的感到困惑,」再次閱讀鏈接問題的標題。這是必要的,因爲收集是空的。如果空集合的總和不爲零,你會期望什麼?顯然'0'不會削減它,因爲'0'是一個完全有效的值。 – 2015-01-09 18:43:37
@DavidTansey:我確實看到了這一點,但它並沒有提供我在問題結束時提出的任何問題的線索。這是我將根據需要採取的方法。只是想明白爲什麼。 – 2015-01-09 18:45:40