0

単一のレコードを照会するリポジトリ (Entity Framework) があります。特定のクエリに対して単一のレコードのみが存在する必要があります。当初、クエリはSingleOrDefault().

明らかに、クエリ内の複数の結果は例外をスローします。でラップされるものはありませんtry/catch。これらのクエリをブロックでラップするのではなく、try/catch次のような拡張メソッドを提案しました。

  public static bool IsEmpty<T>(this IQueryable<T> Query, out int Count) {
     Count = Query.Count();
     return Count == 0;
  }

これには、空のクエリの戻り値があるか、単一の結果の戻り値があるかを単純に判断するよりも多くの点で利点があります。

別の方法は、クエリを try/catch でラップすることです。私の質問は、拡張メソッドまたは例外をキャッチする費用が優先されるかどうかです。主観的ではないように、例外をキャッチしてスローするコストとCount()メソッドのコストを具体的に言及しています。

データベースは 1 つのレコードのみを返すことが期待されていますが、データベースには予期しないレコードが含まれるというのが私のアプローチです。これが例外的なイベントであるとは認識していないため、例外をスローする必要性を認識していません。

拡張メソッドの典型的な実装は次のとおりです。

     var query = Repository.All().Where(*/ some criteria */);

     int count;
     if (query.IsEmpty(out count)) {
        // handle empty return
     } else if (count > 1) {
        // handle unexpected returns
     }

     return query.Single();

編集
重要な注意: あいまいな結果と、返されるレコードの数について通知を受けたいと考えています。

4

1 に答える 1

3

誤ってクエリを複数回実行しないように注意してください。

var query =
    Repository.All()
    .Where(*/ some criteria */)
    .Take(2) //magic here
    .ToList();

if (query.Count == 0) {
    // handle empty return
} else if (query.Count > 1) {
    // handle unexpected returns
}

return query.Single();

行をクエリして、TOP 2すべてのケースを処理します。

于 2012-11-29T16:49:46.750 に答える