将表达式转换为表达式>

本文关键字:表达式 bool func 转换 | 更新日期: 2023-09-27 18:32:51

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

最后,我列出了List<Expression>,需要在Expression<Func<T, bool>>上生成,其中List<Expression>的每个表达式都与AND聚合。

将表达式转换为表达式<func<t,bool>>

是的;只需调用 Expression.Lambda<Func<T, bool>>(..., parameter) ,其中 ... 是由要组合的表达式组成的表达式。

你可能想要list.Aggregate(Expressions.AndAlso).

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

这是可能的,但列表中的每个表达式实际上都必须是一个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);
        }
    }
}