这个PredicateBuilder类是如何工作的?

时间:2011-03-14 17:07:03

标签: linq c#-4.0

我一直在阅读Joseph Albahari关于C#4.0的精彩书籍,我遇到了这个课程:

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);
        }
    }

有人可以向我解释这个功能在做什么以及它是如何工作的?我知道它用于向表达式树添加andor条件,但它实际上是如何工作的?我从未使用像Expression这样的类。这个具体代码在做什么?

var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());

                return Expression.Lambda<Func<T, bool>>
                     (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);

我知道Func是一个委托,它应该返回true或false但是这个代码一般在做什么?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

这是使用Expression Trees从两个表示谓词的输入表达式“构建”谓词。

表达式树是一种使用lambda在树状结构(而不​​是直接委托)中生成代码表示的方法。这需要两个表示谓词(Expression<Func<T,bool>>)的表达式树,并将它们组合成一个表示“或”情况的新表达式树(以及第二种方法中的“和”情况)。

表达式树及其相应的实用程序(如上所述)对ORM之类的东西很有用。例如,实体框架使用带有IQueryable<T>的表达式树将定义为lambda的“代码”转换为在服务器上运行的SQL。