C# 用C语言构建动态表达式

C# 用C语言构建动态表达式,c#,linq,asp.net-core,C#,Linq,Asp.net Core,我试图在一个应用程序中构建一个动态查询,该应用程序从前面到后面发送一些参数,然后用这些参数构建一个表达式 我基本上有两个主要的类来完成所有的工作。连接名为PredicateBuilder的表达式的泛型类和使用它来构建表达式本身的类 谓词生成器 自定义谓词生成器 正如我所展示的,我尝试了两种方法,当我在查询中使用第一种方法时,我得到了一个异常。从作用域引用了类型为“System.String”的变量“b”,但未定义该变量 我只是想知道为什么会出现这种异常以及如何解决它。我回答了一个类似的问题可能会

我试图在一个应用程序中构建一个动态查询,该应用程序从前面到后面发送一些参数,然后用这些参数构建一个表达式

我基本上有两个主要的类来完成所有的工作。连接名为PredicateBuilder的表达式的泛型类和使用它来构建表达式本身的类

谓词生成器 自定义谓词生成器 正如我所展示的,我尝试了两种方法,当我在查询中使用第一种方法时,我得到了一个异常。从作用域引用了类型为“System.String”的变量“b”,但未定义该变量


我只是想知道为什么会出现这种异常以及如何解决它。

我回答了一个类似的问题可能会有帮助我回答了一个类似的问题可能会有帮助
    public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }
    public class CustomPredicateBuilder
    {
        public Expression<Func<Ticket, bool>> Build(DtoTicketFilter filter)
        {
            var expression = PredicateBuilder.True<Ticket>();

            // APPROACH 1 - Get an exception
            expression = expression.And(a => filter.IncludeWords.Select(b => a.Content.Contains(b)).Aggregate((c, d) => c && d));

            // APPROACH 2 - It works
            foreach (var word in filter.IncludeWords)
                expression = expression.And(x => x.Content.Contains(word.ToLower()));

            return expression;
        }
    }