2011-01-07 6 views
0

私はジェネリックリポジトリとやりとりするジェネリッククラスを実装しようとしています。リポジトリからオブジェクトを取得する必要がある場合を除いて、すべて問題ありません。ジェネリッククラスを使用するときにPKを介してEFを照会する方法は?

私はintを受け取る汎用クラスの仮想メソッドを持っていますが、そのintを使用して、主キーでオブジェクトを取得するリポジトリへのクエリを作成したいと考えています。私はEFのEntityKeyプロパティで作業する必要があると感じていますが、あまりにも確実ではありません。とにかく

、ここで私は、誰かが私が欲しいものを達成する方法についての提案を持っていることを願って、私はコードでやろうとしているものです:

public virtual T Get(int PrimaryKey) { 
    this.Repository.Select(
     t => 
      (t.PRIMARYKEY == PrimaryKey)).Single(); 
} 

私は、より特殊なクラスで、このクラスを拡張したいのですが、それらのほとんどはPKを照会することによってオブジェクトを取得するだけなので、それができる基本メソッドを持っているからです。

ご協力いただきありがとうございます。私は反射を得ている、と私はその適切な方法を疑うが、それはやや働く場所だから、ここで私は、エンティティへのメッセージLINQでNotSupportedExceptionを取得しています...

UPDATE

をです'System.Object GetValue(System.Object、System.Object [])'メソッドのメソッドを認識せず、このメソッドをストア式に変換することはできません。。リフレクションを使用する方法を知っている人は、私とは違って、私を指すことができることを願って

private readonly string TEntityName = typeof(T).Name; 

public virtual T Get(
    int PrimaryKey) { 
    return this.Repository.Select(
     t => 
      (((int)t.GetType().GetProperties().Single(
       p => 
        (p.Name == (this.TEntityName + "Id"))).GetValue(t, null)) == PrimaryKey)).Single(); 
} 

:私はそれが言うことを理解し、なぜそれが言っているが、私は私のコードは次のようになりますときにそれを克服するかどうかはわかりません正しい方向に。ありがとう!

答えて

1

はこのように、表現/述語が必要です。

Expression<Func<Order,bool>> predicate = x => x.OrderId == 1; 
return ctx.Orders.Single(predicate); 

動的にこの述語を作成することができるようにする簡単な方法(反射または式ツリーの作成の短い)はありません。

public virtual T Get(Expression<Func<T,bool>> predicate) { 
    this.Repository.Select(predicate).Single(); 
} 

はまた、あなたが(いずれかのクラス/メソッドレベルで)Tの上にいくつかの一般的な制約を置くことを確認してください:あなたは何ができるか

は、パラメータとして述語を受け入れています。

+0

こんにちは@ RPM1984、もう一度会いに!私も式を渡すことを考えていましたが、私はその要件を幾分取り除きたいと思っていました。例えば、私のアプリは 'Supervisor' - >' Provider' - > 'Repository'のように階層化されています。それは私が一般化しようとしている 'プロバイダー'です。式を使って(イージーソソリューションであっても)私はそれを 'Supervisor'レイヤーに作成し、それを'リポジトリ 'に全て渡す必要があります。結局、私が試して避けたいと思っていることがたくさん繰り返されます。私は反射が出てくるかもしれないと考えましたが、何を反映するかはわかりません... – Gup3rSuR4c

+0

残念ながら、反射と表現の木は私の強みではなく、両方が必要です。あなたが持っているのは型(T)と値型(int)です。そのために述部を作成する必要があります。おそらくエンティティに属性を追加した場合(たとえば、g' [PrimaryKey] ')、それを反映して式ツリーを作成します。 – RPM1984

+0

ええ、これは私が試したことです(私の質問で更新します)が、戦いなしではあきらめることはありません...これは反映されているので、もっと具体的な質問をします。助けてくれてありがとう! – Gup3rSuR4c

関連する問題