リフレクションによるプロパティの取得は明らかに SQL に変換できないため、例外は正常です。
私が試みることの 1 つId
は、特定の型のプロパティを公開するジェネリック インターフェイスを作成することです。
public interface HasId<T> {
T Id { get; set; }
}
これで、エンティティが を実装していると宣言できます。HasId<int>
たとえば、Id
タイプが の場合int
です。
次のステップは、次のようにメソッドを変更することです。
public static IEnumerable<T> GetModified<TId, T>
(IQueryable<T> objects, TId[] ids) where T : class, HasId<TId>
{
return objects.Where(j => ids.Contains(j.Id));
}
追加された一般的な制限に注意してください: where T : class, HasId<TId>
. これにより、リフレクションに頼る代わりにj.Id
、値を返す簡略化された を書くことができます。TId
このコードを実行またはテストしていないことに注意してください。あなたの問題を見たときに得たアイデアに過ぎず、役に立てば幸いです。
アップデート:
インターフェイスを宣言したり、クラスを変更したりする必要のない別の解決策を次に示します。
public static IEnumerable<T> GetModified<TId, T>
(IQueryable<T> objects, TId[] ids, Expression<Func<T, TId>> idSelector)
where T : class
{
return objects.Where(j => ids.Contains(idSelector(j)));
}
ここで行ったのは、 の特定のインスタンスの をExpression<Func<T, TId>> idSelector
返すことができる式であるパラメータを追加することです。Id
T
次のようにメソッドを呼び出します。
var modified = GetModified(dbObjects, yourIdArray, entity => entity.Id);
(3 番目のパラメーターのみが新しいものです。他のパラメーターは現在の状態のままにしてください)。
繰り返しますが、ここにVSを備えたコンピューターがないため、これが機能するか、コンパイルされるかどうかはテストしていません:(。