gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:09:04 25 4
gpt4 key购买 nike

剧情:

我有一个类实现为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com