私はジェネリックリポジトリとやりとりするジェネリッククラスを実装しようとしています。リポジトリからオブジェクトを取得する必要がある場合を除いて、すべて問題ありません。ジェネリッククラスを使用するときに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();
}
:私はそれが言うことを理解し、なぜそれが言っているが、私は私のコードは次のようになりますときにそれを克服するかどうかはわかりません正しい方向に。ありがとう!
こんにちは@ RPM1984、もう一度会いに!私も式を渡すことを考えていましたが、私はその要件を幾分取り除きたいと思っていました。例えば、私のアプリは 'Supervisor' - >' Provider' - > 'Repository'のように階層化されています。それは私が一般化しようとしている 'プロバイダー'です。式を使って(イージーソソリューションであっても)私はそれを 'Supervisor'レイヤーに作成し、それを'リポジトリ 'に全て渡す必要があります。結局、私が試して避けたいと思っていることがたくさん繰り返されます。私は反射が出てくるかもしれないと考えましたが、何を反映するかはわかりません... – Gup3rSuR4c
残念ながら、反射と表現の木は私の強みではなく、両方が必要です。あなたが持っているのは型(T)と値型(int)です。そのために述部を作成する必要があります。おそらくエンティティに属性を追加した場合(たとえば、g' [PrimaryKey] ')、それを反映して式ツリーを作成します。 – RPM1984
ええ、これは私が試したことです(私の質問で更新します)が、戦いなしではあきらめることはありません...これは反映されているので、もっと具体的な質問をします。助けてくれてありがとう! – Gup3rSuR4c