これらの行を含む大きなEntity Frameworkクエリがあります。私は、データを実体化するとEntity FrameworkクエリでSum()が返される
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.
次のように私は(2つのタイプキャストで追加)私のクエリを変更すると、エラーが消えます。
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
はnullを入力できないDecimalです。 Sum()
コールにカーソルを合わせると、IntellisenseはDecimal型を返します。さらに2番目のバージョンでは、ProgramBillings
にデータがない行では、totalCharges
とtotalCredits
の両方がnullに設定されていることが確認されました。
質問:
私は
Sum()
は空のコレクションのために0を返さ理解。どのような状況でこれは真実ではありませんか?そして、それが真実でない場合、
Sum()
にカーソルを置くと、IntellisenseはDecimalではなくDecimal型を返します。インテリセンスには、私が持っていたのと同じ理解があったようです。
EDIT:
簡単に修正がSum() ?? 0m
ような何かをしていることと思われます。あなたはここにそうであるように、オブジェクトにLINQを使用していない場合は
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 –
@ジョナサンウッド: "しかし、私はまだこれがなぜ必要かについて混乱しています"再びリンクされた質問のタイトルを読んでください。コレクションが空であるために必要です。空でないコレクションの合計がnullでない場合、あなたは何を期待しますか?明らかに、「0」は合計に対して完全に有効な値であるため、「0」はそれをカットしない。 –
@DavidTansey:私はそれを見ましたが、私の質問の終わりに私が質問する質問のいずれかについての手がかりを提供しません。これは、必要に応じて私が取るアプローチです。理由を理解したかっただけです。 –