可以从不同对象集返回的谓词或动态Linq?

时间:2013-10-30 02:09:33

标签: c# linq entity-framework predicate dynamic-linq

假设我的实体框架支持的项目“汽车和卡车”中有两个实体集。汽车和卡车都实现了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。

1 个答案:

答案 0 :(得分: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

的内容