質問

私は(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つのパラメータを取る方法の第二のバージョンを使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top