18

私はこのコードを持っています(わかりました、私は持っていませんが、似たようなものです:p)

    var dogs = Dogs.Select(ø => new Row
    {
            Name = ø.Name,
            WeightOfNiceCats = ø.Owner
              .Cats
              .Where(æ => !æ.Annoying)
              .Sum(æ => æ.Weight),
    });

ここでは、すべての犬を調べて、犬と同じ飼い主を持つ迷惑ではないすべての猫の重みを (null 非許容の 10 進数に) 合計します。もちろん、ほとんどすべての猫は迷惑なので、次のエラーが表示されます。

Null 非許容値型である System.Decimal 型のメンバーに null 値を割り当てることはできません。

使用されるフィールドまたは外部キーはいずれも null にすることはできません。Whereそのため、句が猫を返さない場合にエラーが発生しますが、これはよくあることです。しかし、どうすればこれを解決できますか?そのときに0を返したい。句のDefaultIfEmpty()後に試してみましたが、次のエラーが発生します。Where

オブジェクト参照がオブジェクト インスタンスに設定されていません。

これは理解できると思います。??の後に a を追加しようとしましたSumが、このエラーのためにコンパイルされません:

演算子「??」タイプ 'decimal' および 'decimal' のオペランドには適用できません

もちろん、これも理にかなっています。それで、なにかお手伝いできますか?Sum合計するものが何もないときに 0 が返されたらいいですね。またはSumOrZeroある種の声明。SumOrZeroLinq2SQL で動作するメソッドを作成するのは難しいでしょうか?

4

4 に答える 4

22

これは私が今のところ終わったものです:

.Sum(æ => (decimal?) æ.Weight) ?? 0.0M,

これは魅力のように機能します。

なんらかの理由で元に戻らないことを除いてSumOrZero、通常とまったく同じように機能する、使用できるものを引き続き使用したいと思います。他の人が指摘したように、これは非常に簡単に作成できますが、Linq2SQL などで動作するように作成するのは少し難しいので、今のところそのままにしておきます。誰かがいつか退屈して、すべての数値型に対して Linq2SQL で動作するforを書いたら、私に知らせてください:DSumnullIEnumerableIQueryableSumOrZeroIQueryable

于 2009-02-23T12:57:32.253 に答える
5

LINQ to Objects では簡単です。LINQ to SQL を使用すると、さらに難しくなります。Queryable.Sumnull 許容型へのキャストを使用して、通常の式から構築された式で呼び出す独自の拡張メソッドを作成できます。??を行う必要があると思います ただし、呼び出しコードでは 0m です。つまり、次のことができます。

.SumOrNull(æ => æ.Weight) ?? 0M,

.SumOrNull の署名は次のようになります。

public static decimal? SumOrNull<TSource, decimal>(this IQueryable<TSource>,
    Func<TSource,decimal> projection)

基本的に、Queryable でサポートされているすべての値の型に対してそれを書くことができます。汎用的に記述し、リフレクションを使用して Queryable で適切なメソッドを呼び出すこともできますが、それも面倒です。

正直に言うと、あなたが持っているものでうまくいくと思います。

于 2009-02-23T09:29:25.060 に答える
3

あなたが既に与えたトリック ( .Sum(æ => (decimal?) æ.Weight) ?? 0.0M) は、このシナリオがデータベースでクエリとして実行される場合に、私が考えることができる最善のものです。少し面倒ですが、もっと悪いことがあります...

LINQ-to-Objects とは異なり、基になるプロバイダーによってマップされる必要があるため、独自の拡張メソッドを追加することはできません。

于 2009-02-23T09:23:28.057 に答える
0

DefaultIfEmpty を使用すると、1 つの要素が 0 の IEnumberable が返されます。これは意味的には必要なものと同じです。

null 許容の 10 進数があるため、おそらく 2 つのパラメーターを使用するメソッドの 2 番目のバージョンを使用する必要があります。

于 2009-02-23T09:37:32.950 に答える