2012-02-15 15 views
4

次のような構成が可能ですか?Funcの配列を持つことは可能ですか

その後、

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case, x => x.CaseOwner) 

は基本的に私からこれらの戦略を指定するために私たちを可能にするために、私たちの抽象リポジトリにNHibernateのための戦略をフェッチの付加を含むしようとしています...このように呼ばれることができ

public IQueryable<T> AllWithFetch<TRelated>(IQueryable<T> existing, params Expression<Func<T, TRelated>>[] fetchExpressions) 
    { 
    return fetchExpressions.Aggregate(existing, (current, exp) => current.Fetch(exp)); 
    } 

リポジトリのパターンを壊すことなく、私たちのロジック層。たとえば、NHibernateから別のORMに変更した場合、同じリポジトリメソッドを提供できますが、そのORMに実装されています。

問題は、param配列の複数の関数にチェーンしようとすると表示されます。

だから、この作品...

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case) 

しかし、これは "型の引数は、その使用方法から推測することはできません" messgeで失敗し

var allDetails = this.preGrantDetailRepository 
       .AllWithFetch(this.preGrantDetailRepository.All, x => x.Case, x => x.CaseOwner) 

私は、.NET 3.5、リポジトリのパターンを使用しています、流暢NHibernateは、SQL Server 2008の

EDIT

私は、以下のPorgesの回答の助けを借りて問題を解決しました。私はそれを受け止めました。この問題は、TRelatedの誤った使用に起因していました。ここでは、リポジトリ内の加工方法は...

public IQueryable<T> AllWithFetch<T>(IQueryable<T> existing, params Expression<Func<T, Entity>>[] fetchExpressions) 
     { 
      return fetchExpressions.Aggregate(existing, (current, exp) => current.Fetch(exp)); 
     } 

ある今AllWithFetch TRelatedと私はのFuncに2つのエンティティ(ケース& CaseOwner)のスーパークラスを使用していません。

はあなたが各FUNCの戻り値としてTRelatedている必要がありますあなたの助けみんな

+0

'.Case'と' .CaseOwner'の戻り値の型は何ですか? – AakashM

答えて

4

問題はあなたのTRelatedあり、これは特にparamsを行うには何もありません。

は例えば、これを試してみてください:

void DoSomething<T,U>(Func<T,U> f, Func<T,U> f2) 
{ 
} 

void Main() 
{ 
    DoSomething((int x) => x + 1, (int x) => x + ""); 
} 

コンパイラはTintでなければならないことを推測しますが、それはUための良いタイプを推測することはできません(私は正確な詳細はわからないんだけど、それは一般的に継承チェーンを上回るタイプを探すことはありません)。

これを機能させるには、スーパークラスを指定する必要があります。この場合には、object

void Main() 
{ 
    DoSomething<int,object>((int x) => x + 1, (int x) => x + ""); 
} 

は、だからあなたは(それがここ objectになりますように見えます)スーパークラスを自分で指定するか、単に TRelatedパラメータを取り除く必要がありますどちらか。

2

いただきありがとうございます。 .Caseと.CaseOwnerは同じ型ですか?ノーならば、あなたは

Func<T, object> 
代わり

(または任意のインタフェース)を使用することができます

関連する問題