剧情:
我有一个类实现为 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); }
- 我需要将使用 DTO 的表达式作为 In 参数并返回 IQueryable,其中 T : BaseDto 作为结果
- 我需要将输入谓词转换为使用 EF 实体作为 In 参数的相同谓词
- 我需要借助动态创建的表达式(谓词)过滤非通用 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/