c# - DbContext.Set() 上的 LINQ

标签 c# linq entity-framework reflection

所以,基本上我是在尝试获取从实体名称(字符串)返回的 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/

相关文章:

c# - 集成 Microsoft Office Communicator 2007 R2 - 示例?

c# - 如何从c#获取网站标题

c# - 使用 linq 加载除另一个集合之外的集合

c# - PredicateBuilder 返回所有用户 predicate.Or

c# - 为什么这个额外的连接会增加查询的数量?

c# - 接口(interface)中的 ICollection 与另一个接口(interface)作为类型

asp.net - (0..1---*) 在实体关系图/实体数据模型 (.edmx) 中是什么意思

c# - 使用 iText7 + C# 从 pdf 读取文本,无法识别文本

c# - 重新采样环回捕获

c# - 使用 LINQ 基于多个参数进行过滤?