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;
}
所以,答案是...你的魔术功能不能按预期工作。
当您在魔术函数中时,您正在使用表达式树。 y.Id 此时没有值,因此您无法解析它。 相反,您必须返回一个函数,该函数可以在具有值时解析 y.id。 在函数上添加参数大大简化了事情,并且实际上是一回事.....
public static Func<TEntity, TDto, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression)
{
return expression.Compile();
}