2

複数の結果を返すエンティティフレームワークを介して呼び出しているストアドプロシージャがあります。私はDbContext.Translateメソッドを使用して、これらの結果を次のようなエンティティにマップし直しています。

List<T1> result1 = ObjectContext.Translate<T1>(reader).ToList();
reader.NextResult();

List<T2> result2 = ObjectContext.Translate<T2>(reader).ToList();
reader.NextResult();

List<T3> result3 = ObjectContext.Translate<T3>(reader).ToList();
reader.NextResult();

これはうまく機能しますが、今では20を超える結果を返すプロシージャがあります。メソッドのオーバーロードを20回作成せずに、結果を一般的にマップできるようにしたいと考えています(将来、2〜20個の結果セットを返すストアドプロシージャが増えると予想されるため)。

多くのメソッドのオーバーロードを発生させることなく、ループ内でこのマッピングを実行できる方法はありますか?

4

1 に答える 1

1

多くのメソッドのオーバーロードを発生させることなく、ループ内でこのマッピングを実行できる方法はありますか?

いいえ、違います。

あなたがすでに説明したことは、それがどのタイプを扱っているかを伝えなければならないことを考えると、これを行うための最良の方法だと思います。ObjectContext

ジェネリックパラメーターの数を増やして含む複数のオーバーロードを使用して、ジェネリック関数のセット(Func<T>およびと同様)を作成できます。Action<T>

たとえば、最初の2つの実装は次のようになります。

public static Tuple<List<T1>> GetSprocResults<T1>
    (DataTableReader reader, ObjectContext objectContext)
{
    var t1 = objectContext.Translate<T1>(reader).ToList();

    return new Tuple<List<T1>>(t1);
}

public static Tuple<List<T1>, List<T2>> GetSprocResults<T1, T2>
    (DataTableReader reader, ObjectContext objectContext)
{
    var t1 = objectContext.Translate<T1>(reader).ToList();
    reader.NextResult();

    var t2 = objectContext.Translate<T2>(reader).ToList();

    return new Tuple<List<T1>, List<T2>>(t1, t2);
}

使用例:

        var result = GetSprocResults<DateTime, int>(reader, objectContext);

        var datesCount = result.Item1.Count;
        var intCount = result.Item2.Count;

コードのコンテキストでこの機能を一連のメソッドにリファクタリングすることが理にかなっている場合は、複数のオーバーロードがあることに問題はないと思います。

于 2013-03-22T12:49:42.897 に答える