合計()の代わりにするときがない行0を返すの例外が発生します
-
05-09-2019 - |
質問
私は(OK、私はしませんが、似たような:P)は、このコードを持っている。
var dogs = Dogs.Select(ø => new Row
{
Name = ø.Name,
WeightOfNiceCats = ø.Owner
.Cats
.Where(æ => !æ.Annoying)
.Sum(æ => æ.Weight),
});
ここで私はすべての犬を通過し、犬と同じ所有者がすべてではない、迷惑な猫の(null非許容小数に)体重をまとめます。もちろん、ほとんどすべての猫は迷惑しているので、私はこのエラーを取得します:
ヌル値は、非null許容値型であるタイプSystem.Decimalの有する部材に割り当てることはできません。
使用されるフィールドまたは外部キーのどれがnullになることはできません。 Where
句は、それが頻繁にありません何の猫が、返さないときにエラーが発生します。しかし、どのように私はこれを解決することができますか?私はそれが起こるとき、それは0を返すようにしたいです。 DefaultIfEmpty()
句の後Where
てみましたが、その後、私はこのエラーを取得します:
オブジェクト参照オブジェクトのインスタンスに設定されていない。
私が理解しやすいと思いますどの。私は??
後Sum
を追加しようとしましたが、それは文句を言わないので、このエラーのコンパイルます:
演算子 '??'型「小数」と「小数」
のオペランドに適用することはできません
これも当然の理にかなっています。じゃあどうすればいい?合計するものは何もなかったときSum
ものがちょうど0を返した場合よいでしょう。あるいはある種のSumOrZero
声明。それはLinq2SQLで働いSumOrZero
メソッドを作ることは難しいでしょうか?
解決
これは私が今のところしてしまったものです。
.Sum(æ => (decimal?) æ.Weight) ?? 0.0M,
これは魔法のように動作します。
それが何らかの理由でSumOrZero
を返すことはない除い私はまだ定期的にSum
とまったく同じように働くだろう、私が使用することができnull
を、持っていることを好むだろう。他の人が指摘しているように、これはIEnumerable
が、それはなど、Linq2SQLで動作しますので、私はちょうど今のことでそれを残しますのでIQueryable
のために作成する方が不快なビットのために作るのはかなり簡単だろう。誰かが退屈一日で、すべての数値型用Linq2SQLで動作SumOrZero
ためIQueryable
を書くならば、私に知らせてくださいが:D
他のヒント
LINQのオブジェクトへのそれは簡単だろう。 LINQは、SQLするとそれが難しくなります。あなたはNULL可能型へのキャストで、通常1から構築式でQueryable.Sum
と呼ばれる独自の拡張メソッドを書くことができます。私はあなたがする必要があると思います疑います?しかし、呼び出し元のコードで0メートル。言い換えれば、あなたが行うことができます:
.SumOrNull(æ => æ.Weight) ?? 0M,
どこ.SumOrNullのための署名は以下のようになります:
public static decimal? SumOrNull<TSource, decimal>(this IQueryable<TSource>,
Func<TSource,decimal> projection)
あなたは基本的に照会可能でサポートされるすべての値の型のためにそれを書くことができます。あなたは<全角> は一般的にそれを書き、リフレクションを使用して照会可能で適切なメソッドを呼び出すことができますが、それはあまりにも不快になります。
私はあなたが正直に言うと、持っているものとオフのベストだと思う。
あなたはすでに(.Sum(æ => (decimal?) æ.Weight) ?? 0.0M
)与えてくれたのトリックは、それがデータベースのクエリとして実行したときに、私は、このシナリオのための考えることができる最善についてです。少し迷惑な、しかしより悪いものがある...
とは異なり、LINQツーオブジェクト、あなただけ、あなた自身の拡張メソッドを追加することはできません。
あなたは0の単一の要素でIEnumberableを返しますDefaultIfEmptyを、使用したい、それはあなたが必要と意味的に同じになります。
あなたがNULL可能小数を持っているとして、あなたはおそらく2つのパラメータを取る方法の第二のバージョンを使用する必要があります。