Как работает этот класс PredicateBuilder? - PullRequest
3 голосов
/ 14 марта 2011

Я читал блестящую книгу Джозефа Албахари на 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);
        }
    }

Кто-нибудь может мне объяснить, что эта функция делает и как она работает?Я знаю, что он используется для добавления условий and и or в дерево выражений, но как это на самом деле работает?Я никогда не использовал такие классы, как 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 Ответ

1 голос
/ 14 марта 2011

Используется Деревья выражений для "построения" предиката из двух входных выражений, представляющих предикаты.

Деревья выражений - это способ использования лямбда-выражений для генерации представления кода в древовидной структуре (а не в делегате напрямую). Это берет два дерева выражений, представляющих предикаты (Expression<Func<T,bool>>), и объединяет их в новое дерево выражений, представляющее регистр "или" (и регистр "и" во втором методе).

Деревья выражений и соответствующие им утилиты, как указано выше, полезны для таких вещей, как ORM. Например, Entity Framework использует деревья выражений с IQueryable<T>, чтобы превратить «код», определенный как лямбда, в SQL, запускаемый на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...