[英]Convert Expression to Expression<Func<T, bool>>
Is that possible to convert Expression
to Expression<Func<T, bool>>
if instance of Expression was created on T
? 如果在
T
创建表达式的实例,是否可以将Expression
转换为Expression<Func<T, bool>>
At the end I have list List<Expression>
and need to produce on Expression<Func<T, bool>>
where each expression of List<Expression>
is agregated with AND
. 最后我有列表
List<Expression>
并且需要在Expression<Func<T, bool>>
上生成List<Expression>
其中List<Expression>
每个表达式用AND
聚合。
It's possible, but every expression in the list must actually be a Expression<Func<T, bool>>
instance. 这是可能的,但列表中的每个表达式实际上必须是
Expression<Func<T, bool>>
实例。
EDIT: It turns out that you use Kendo.Mvc.IFilterDescriptor.CreateFilterExpression which actually builds a MethodCallExpression
s. 编辑:事实证明你使用Kendo.Mvc.IFilterDescriptor.CreateFilterExpression实际上构建了一个
MethodCallExpression
。
The following helper method should do the job (works with both lambda and method call expressions): 以下辅助方法应该完成这项工作(适用于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);
}
}
}
Yes; 是; just call
Expression.Lambda<Func<T, bool>>(..., parameter)
, where ...
is an expression composed of the expressions you want to combine. 只需调用
Expression.Lambda<Func<T, bool>>(..., parameter)
,其中...
是一个由要组合的表达式组成的表达式。
You'd probably want list.Aggregate(Expressions.AndAlso)
. 你可能想要
list.Aggregate(Expressions.AndAlso)
。
If your expressions don't all share the same ParameterExpression
, you'll need to rewrite them to do so. 如果你的表达式并不都共享同一个
ParameterExpression
,那么你需要重写它们才能这样做。 (use ExpressionVisitor
) (使用
ExpressionVisitor
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.