entity-framework - 使用动态构建的表达式过滤非通用 DbSet

标签 entity-framework linq generics expression-trees dbset

剧情:

我有一个类实现为 Entity Framework 数据库上下文的外观。它的开发是为了保持向后兼容性,它模仿具有相同公共(public)接口(interface)的类,但使用 DTO 而不是 EF 实体。

问题:

我在上面描述的类中有 next 方法。见下面的代码:

public IQueryable<T> FindBy<T>(Expression<Func<T, Boolean>> predicate) where T : BaseDto {

//GetDestinationType takes source type of some declared mapping and returns destination type
var entityType = Mapping.Mapper.GetDestinationType(typeof (T));

var lambda = Expression.Lambda(predicate.Body, Expression.Parameter(entityType));

// dbContext declared as class field and initialized in constructor
var query = dbContext.Set(entityType).Where(lambda); // <-- Cannot use non-generic expression/lambda

return query.ProjectTo<T>(mapper.ConfigurationProvider); }
  1. 我需要将使用 DTO 的表达式作为 In 参数并返回 IQueryable,其中 T : BaseDto 作为结果
  2. 我需要将输入谓词转换为使用 EF 实体作为 In 参数的相同谓词
  3. 我需要借助动态创建的表达式(谓词)过滤非通用 EF DbSet

主要问题

是否可以借助动态创建的表达式(谓词)过滤非泛型 EF DBSet

如果我需要使用其他方法,请给我一些胶水或进一步的指导。

最佳答案

问题已经解决。解决方案很明显。而不是

var query = dbContext.Set(entityType).Where(lambda);

我会写

var query = dbContext
                .Set(entityType)
                .ProjectTo<T>(mapper.ConfigurationProvider)
                .Where(predicate);

其中predicate是FindBy()方法的输入参数。

这段代码将被成功编译,更重要的是,EF 将构建对数据库的最佳查询,其中将在查询主体中包含 Where() 子句,因此它不会从数据库端获取完整的记录集。

关于entity-framework - 使用动态构建的表达式过滤非通用 DbSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947856/

相关文章:

c# - LINQ to XML 到数据表

swift - 专门的通用协议(protocol)只能作为通用约束

java - 泛型阶乘,如何实现

generics - 具有构造函数提供的实现的通用成员

java - 测试Java数据库实体类

c# - 自使用 .Net 4.0 以来 visual studio Release模式中的 InvalidOperationException

database - 在 SQL 中处理一对一关系的最佳方式是什么?

.net - Entity Framework 中的可空实体投影

ASP.NET Core 身份 - 无效 token (Linux)

c# - Entity Framework 中有序集的并集,然后跳过