所以,基本上我是在尝试获取从实体名称(字符串)返回的 DbSet
。这是我取得的进展:
var customers = db.Set(Type.GetType("App.Model.Customer,
App.Model,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=null"));
但是我无法执行其他 LINQ,例如 Any()
或 Single()
。为什么会这样?我该如何改变它?
最佳答案
DbContext.Set
的非泛型重载返回一个同样非通用的 DbSet
.此类实现的接口(interface)之一是 IQueryable
,再次,非通用。这就是为什么它不能作为在泛型类型上定义的任何这些 LINQ 扩展方法的输入的原因 IQueryable<T>
.
所以实际上,如果您仍想使用 LINQ,您只需推迟必须转换为泛型的时刻 IQueryable
.你可以做...
var customers = db.Set(Type.GetType(...)).Cast<Customer>().Where(c => ...)
...但是你当然失去了在运行时动态定义类型的全部意义。
一旦你动态地开始,你就必须动态地继续。一种方法是添加 System.Linq.Dynamic
到你的项目。
然后你可以像这样写查询......
var customers = db.Set(Type.GetType(...)).Where("CustomerId = @0", 1);
...这将返回给你 Customer
(包裹在 IQueryable<Customer>
中)有 CustomerId == 1
.
您甚至可以使用 Find
方法:
var customer = db.Set(Type.GetType(...)).Find(1);
这将返回单个 Customer
实例。
关于c# - DbContext.Set() 上的 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26506619/