3

假设我在我的实体框架支持的项目 Cars 和 Trucks 中有两个实体集。Car 和 Truck 都实现了 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

我不确定我是否完全理解这个问题,但似乎你并不需要查询是动态的,只是你要查询的数据库集。如果是这种情况,并且您正在按 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 获取项目。哦,另外,我假设您在示例中拥有的 db 是 a DbContext,或者继承自DbContext

于 2013-10-30T15:20:52.507 回答