我正在为Dto Mapper编写一个通用实体,我遇到了问题。我想以编程方式描述Mapping。
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)=&gt;的第二部分? x.UserId.Equals(y.Id)表达式并创建一个像这样的 x =&gt;的func对象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;
}
答案 0 :(得分:1)
所以,答案是......你的神奇功能无法按照你的意愿运作。
当您使用MagicFunction时,您正在使用表达式树。 y.Id在这个时间点没有价值,因此你无法解决它。相反,你必须返回一个函数,当它有一个值时可以解析y.id.在函数上添加参数可以极大地简化事情,实际上是相同的事情......
public static Func<TEntity, TDto, bool> MagicFunction(Expression<Func<TEntity, TDto, bool>> expression)
{
return expression.Compile();
}