3

私は次の方法でリポジトリを持っています:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification,
                                 Expression<Func<T, TRelated>> fetchExpression);

複数の式を渡す必要があります。私は署名を次のように変更することを考えていました:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification, 
                                 IEnumerable<Expression<Func<T, TRelated>>> fetchExpression);
  1. これは可能ですか?
  2. このメソッドに渡す式の配列などを作成するにはどうすればよいですか?

現在、次のようにサービスレイヤーからメソッドを呼び出しています。

var products = productRepository.FindAll(specification,p => p.Variants);

p => p.Variantsしかし、私は合格したいと思いp => p.Reviewsます、例えば。次に、リポジトリで式を繰り返し処理して、クエリに追加します。

私がこれを行っている理由の背景については、NHibernateを使用したEagerのロードに関するBenFosterのブログ投稿を参照してください。

4

2 に答える 2

5

paramsを使用してそれを行うことができます:

IEnumerable<T> FindAll(Specification<T> specification,
        params Expression<Func<T, object>>[] fetchExpressions)
{
    var query = GetQuery(specification);
    foreach(var fetchExpression in fetchExpressions)
    {
        query.Fetch(fetchExpression);
    }
    return query.ToList();
}

あなたはこれを次のように呼ぶことができます:

var products = productRepository.FindAll(specification,
        p => p.Variants, p => p.Reviews );
于 2011-06-30T13:47:13.197 に答える
0

あなたはこれにあなたの呼び出しを変更することができます:

var products = productRepository.FindAll(specification,
                                         new [] { p => p.Variants, 
                                                  p => p.Reviews });

しかし、これは両方で同じである場合にのみ機能Tします!

于 2011-06-30T13:47:54.193 に答える