【问题标题】:Predicate or Dynamic Linq that can return from different object sets?可以从不同对象集返回的谓词或动态 Linq?
【发布时间】:2013-10-30 02:09:33
【问题描述】:

假设我的实体框架支持的项目中有两个实体集,即 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。

【问题讨论】:

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


    【解决方案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 的东西

    【讨论】:

    • 谢谢,这看起来是一个很好的起点。是的,它是一个 DbContext。
    • @NeilN 你最终找到解决方案了吗?
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多