1

私は次のようなdbテーブルに合成クエリを書くのが好きです:

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0));

残念ながら、where句が要素をまったく返さない場合はエラーがスローされます。.Sumを使用する前に、いくつかの要素があるかどうかを.Anyで確認する必要がありますが、結果のコードは最初のコードと比較して醜いです。try/catchブロックを配置することが良い解決策だとは思わないでください。

次のコードよりも優れたものがありますか?

if (MyDataContext.MyTable.Where(el => el.Client == selectedClien).Any())
  sum =  MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0));
else sum = 0;

ありがとうフィリッポ

さらに調査した後に追加:

MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0)

上記のコードは、コレクションが空の場合に適切に機能します。.Sum()内のラムダに「GetValueOrDefault(0)」を配置した理由は、フィールド「Value」がDecimal?であるため、nullになる可能性があります。一部の要素にnull値がある場合はまだテストしていません。

4

2 に答える 2

0

驚いたことに(私にとって)、コードをより堅牢にしようとして、考えられる例外の原因を紹介しました!堅牢なコードを書く正しい方法は次のとおりです。

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0);

上記のコメントとmsdnドキュメントで述べられているように、

Enumerable.Sum<TSource> Method (IEnumerable<TSource>, Func<TSource, Nullable<Decimal>>)

null値と空のコレクションに対して堅牢です。GetValueOrDefault()は、null以外のDecimalを返すことを保証します。

とにかく、最初のコードが例外をスローする理由はまだはっきりしていません。

于 2012-05-21T07:41:37.233 に答える
0

それを回避するための拡張機能を作成しました。

    public static decimal? SafeSum<T>(this IEnumerable<T> source, Func<T, decimal?> selector)
    {
        try
        {
            return source.Sum(selector);
        }
        catch
        {
            /* ignore exception */
            return null;
        }
    }
于 2012-05-18T09:03:16.320 に答える