C#表达部分解决。 Curring?

时间:2014-12-13 00:23:37

标签: c# linq lambda

我正在为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;
}

1 个答案:

答案 0 :(得分:1)

所以,答案是......你的神奇功能无法按照你的意愿运作。

当您使用MagicFunction时,您正在使用表达式树。 y.Id在这个时间点没有价值,因此你无法解决它。相反,你必须返回一个函数,当它有一个值时可以解析y.id.在函数上添加参数可以极大地简化事情,实际上是相同的事情......

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