lbr*_*him 1 c# linq reflection entity-framework
所以,基本上我试图DbSet从实体名称(字符串)返回.这是我走了多远:
var customers = db.Set(Type.GetType("App.Model.Customer,
App.Model,
Version=1.0.0.0,
Culture=neutral,
PublicKeyToken=null"));
Run Code Online (Sandbox Code Playgroud)
但后来我无法执行其他LINQ Any()或者Single().为什么这样,我怎么能改变呢?
DbContext.Set返回的非泛型重载同样是非泛型的DbSet.这个类实现的接口之一IQueryable同样是非泛型的.这就是为什么它不能作为泛型类型上定义的任何LINQ扩展方法的输入的原因IQueryable<T>.
所以实际上,如果您仍然想使用LINQ,那么只需要推迟转换为泛型的时刻IQueryable.你可以 ......
var customers = db.Set(Type.GetType(...)).Cast<Customer>().Where(c => ...)
Run Code Online (Sandbox Code Playgroud)
...但是当然你在运行时失去了动态定义类型的全部意义.
动态启动后,您必须动态继续.一种方法是添加System.Linq.Dynamic到您的项目中.然后你可以写像...这样的查询
var customers = db.Set(Type.GetType(...)).Where("CustomerId = @0", 1);
Run Code Online (Sandbox Code Playgroud)
...它会让你Customer(包裹在一起IQueryable<Customer>)拥有CustomerId == 1.
你甚至可以使用这个Find方法:
var customer = db.Set(Type.GetType(...)).Find(1);
Run Code Online (Sandbox Code Playgroud)
这将返回单个Customer实例.
| 归档时间: |
|
| 查看次数: |
3335 次 |
| 最近记录: |