3

Entity Framework でサポートされているプロジェクトである Cars と Trucks に 2 つのエンティティ セットがあるとします。車とトラックの両方が IDriveable を実装します

呼び出し元の関数がどのセットからロードされるかを知らなくても、Predicate または Dynamic Linq が特定の IDriveable を返すようにすることは可能ですか?

私が見た Dlinq のすべての例には、次のようなものがあります。

db.Cars.Where("ID==123");

「動的」部分は、既にテーブル/セットを選択した後に来ます。次のようなものが必要です

db.SomeMethod("Cars.Where(ID==123)");

述語に関しては、これまでに見た例は、次のようなリストに作用する関数です。

static bool greaterThanTwo(int arg)
{
    return arg > 2;
}

これは、目的のセットへの参照が既にあることを前提としています。どのテーブルからレコードをロードするかを動的に伝える方法と、レコードの一意の ID をフィルター処理する方法が必要です。

4

1 に答える 1

1

質問を完全に理解しているかどうかはわかりませんが、クエリを動的にする必要はなく、クエリしているdbsetだけが必要なようです。その場合、ID でフィルタリングしている場合、次のようなものが機能する可能性があります。

var type = Assembly.GetCallingAssembly().GetTypes().Single(x => x.Name == "Car");
var method = db.GetType().GetMethod("Set", BindingFlags.Instance | BindingFlags.Public).MakeGenericMethod(type);
var set = (DbSet) method.Invoke(db, new object[0]);
var myDrivableThing = (IDrivable) set.Find(id);

これは完全にテストされておらず、コンパイルできない可能性があるため、多少の誤解を招くかもしれませんが、必要な動的タイプの dbset を取得し、find メソッドを使用して ID で項目を取得する必要があります。ああ、また、あなたの例にあるデータベースはDbContext、またはから継承したものであると想定していますDbContext

于 2013-10-30T15:20:52.507 に答える