Для построения выражений фильтров используется класс PredicateBuilder (из пространства имен Ultima.Linq). С помощью этого класса можно строить строго типизированные выражения-предикаты, использующие extension-методы And или Or для комбинации подвыражений.
Класс PredicateBuilder реализует следующие методы:
•PredicateBuilder.Get<T>(expr) – возвращает предикат expr для класса T;
•PredicateBuilder.Get<T>() – возвращает пустой предикат (null) для класса T;
•PredicateBuilder.True<T>() – возвращает предикат, всегда возвращающий true для класса T;
•PredicateBuilder.False<T>() – возвращает предикат, всегда возвращающий false для класса T;
•expr1.Or(expr2) – комбинирует предикаты expr1 и expr2 с помощью Or, результат такой комбинации: expr1 Or expr2;
•expr1.And(expr2) – комбинирует предикаты expr1 и expr2 с помощью And, результат такой комбинации: expr1 And expr2.
Рассмотрим построение фильтра с помощью PredicateBuilder на примере: Пусть имеется форма, содержащая два поля ввода: имя и фамилия (firstName и lastName). Задача: построить выражение-фильтр для класса Employee, использующее данные из этих полей ввода в комбинации Or (т.е. фильтр пропустит все записи, у которых имя или фамилия содержат введенные данные). Если в каком-либо из полей ввода пусто, соответствующая часть фильтра не используется. Таким образом, если оба поля пусты, фильтр записей также должен оказаться пустым:
Если введены данные в оба поля, результатом работы PredicateBuilder окажется вот такое выражение:
Если введено только firstName, от фильтра останется лишь первая часть:
Если оба поля пусты, сформированный фильтр тоже будет пустым (null). |