LINQ On DbContext.Set()

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().为什么这样,我怎么能改变呢?

Ger*_*old 6

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实例.