2016-02-02 90 views
0

如果在T上创建表达式的实例,是否可以将Expression转换为Expression<Func<T, bool>>将表达式转换为表达式<Func <T, bool>>

在最后我有列表List<Expression>和需要其中List<Expression>每个表达与AND agregated产生对Expression<Func<T, bool>>

+0

不应该的参数是一个'名单<表达式 >>'? –

+0

不,我使用Kendo Grid,其中DataSourceRequest.Filters.Select(x =>)x只有一个方法CreateExpression,它返回表达式类型 – kosnkov

+0

好吧,但是如果表达式的实例是在T上创建的,该列表应该可以转换成'Expression >'? –

回答

1

是;只需致电Expression.Lambda<Func<T, bool>>(..., parameter),其中...是由您想要组合的表达式组成的表达式。您可能需要list.Aggregate(Expressions.AndAlso)

如果您的表达式不全部共享相同的​​,则需要重写它们才能这样做。 (使用ExpressionVisitor

+0

#SLaks Expression.Lambda >(...,参数)然后是什么参数? – kosnkov

+0

@kosnkov:您希望表达式使用的'Expression.Parameter(typeof(T))'。 – SLaks

+0

@SLaks我试过这一个,当查询是materiaized时,我得到了额外的信息异常“参数”没有绑定在specific LINQ to Entities查询表达式“ – kosnkov

0

这是可能的,但列表中的每个表达式实际上必须是Expression<Func<T, bool>>实例。

编辑:事实证明,您使用Kendo.Mvc.IFilterDescriptor.CreateFilterExpression实际上建立一个MethodCallExpression s。

下面的辅助方法应该做的工作(既Lambda和方法调用表达式作品):

public static class Utils 
{ 
    public static Expression<Func<T, bool>> And<T>(List<Expression> expressions) 
    { 
     var item = Expression.Parameter(typeof(T), "item"); 
     var body = expressions[0].GetPredicateExpression(item); 
     for (int i = 1; i < expressions.Count; i++) 
      body = Expression.AndAlso(body, expressions[i].GetPredicateExpression(item)); 
     return Expression.Lambda<Func<T, bool>>(body, item); 
    } 

    static Expression GetPredicateExpression(this Expression target, ParameterExpression parameter) 
    { 
     var lambda = target as LambdaExpression; 
     var body = lambda != null ? lambda.Body : target; 
     return new ParameterBinder { value = parameter }.Visit(body); 
    } 

    class ParameterBinder : ExpressionVisitor 
    { 
     public ParameterExpression value; 
     protected override Expression VisitParameter(ParameterExpression node) 
     { 
      return node.Type == value.Type ? value : base.VisitParameter(node); 
     } 
    } 
} 
+0

我无法做到,我的列表是这样创建的:dataSourceRequest.Filters.Select(x => x.CreateFilterExpre ssion(Expression.Parameter(typeof(T))))。ToList() – kosnkov

+0

什么确实返回'CreateFilter'?显示一些示例实现。或者当转换失败时,您无法投射的表达式的**实际**类型是什么? –

+0

无法强制类型'System.Linq.Expressions.InstanceMethodCallExpressionN'类型的对象(这里是类型的表达式>) – kosnkov

相关问题