C# 表达式部分解析.诅咒

本文关键字:诅咒 分解 表达式部 | 更新日期: 2023-09-27 18:34:09

我正在向Dto Mapper编写一个通用实体,但我遇到了问题。我想以编程方式描述映射。

public void ById( Expression<Func<TDto, object>> propertySelector, Expression<Func<TEntity, TDto, bool>> expression ) {
    // Just the Setter what will be mapped
}

所以在我的 我调用 ById 函数并传递所需的表达式。在本例中,此映射描述如何获取实体 Entity.UserId 等于 Dto.Id 的实体列表。

ById( ( x, y ) => x.UserId.Equals( y.Id ) );

后端服务本身也是通用的,由"TDto"类型生成。后端服务已经包含一个"Where"函数,该函数可以访问一个函数。

public List<TEntity> Where<TEntity>(Func<TEntity, bool> predicate) {
    ObjectSet<TEntity> Column = _getGenericColumnByType(); 
    return Column.Where( predicate ).ToList();
}

所以通常我会通过以下方式调用我的后端。

GenericBackendService<TEntity> Service = // generateMyService;
Guid searchId = // my Guid im searching for
var result = Service.Where( x => x.Id.Equals(searchId));

现在我的问题来了。有没有办法解析我的 ( x, y ) => x.UserId.Equals( y.Id ) 表达式的第二部分并创建一个像这样的 func 对象 x => x.UserId.Equals("123-456-678")

public Func<TEntity, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression) {
    // 
    // in ->    ( x, y ) => x.UserId.Equals( y.Id )
    //
    // Do the magic
    //
    // out ->     x => x.UserId.Equals("The Id I resolved from y.Id")
    //
    return function;
}

C# 表达式部分解析.诅咒

所以,答案是...你的魔术功能不能按预期工作。

当您在魔术函数中时,您正在使用表达式树。 y.Id 此时没有值,因此您无法解析它。 相反,您必须返回一个函数,该函数可以在具有值时解析 y.id。 在函数上添加参数大大简化了事情,并且实际上是一回事.....

public static Func<TEntity, TDto, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression)
    {
        return expression.Compile();
    }