假设我在 Entity Framework 支持的项目 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。
最佳答案
我不确定我是否完全理解这个问题,但似乎您并不真的需要动态查询,只需要查询哪个数据库集即可。如果是这种情况,并且您正在按 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
关于c# - 可以从不同对象集返回的谓词或动态 Linq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672597/