Для построения выражений фильтров используется класс PredicateBuilder (из пространства имен Ultima.Linq). С помощью этого класса можно строить строго типизированные выражения-предикаты, использующие extension-методы And или Or для комбинации подвыражений.

DevBookmark_Scripts Класс 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.

35_example

Рассмотрим построение фильтра с помощью PredicateBuilder на примере:

Пусть имеется форма, содержащая два поля ввода: имя и фамилия (firstName и lastName). Задача: построить выражение-фильтр для класса Employee, использующее данные из этих полей ввода в комбинации Or (т.е. фильтр пропустит все записи, у которых имя или фамилия содержат введенные данные). Если в каком-либо из полей ввода пусто, соответствующая часть фильтра не используется. Таким образом, если оба поля пусты, фильтр записей также должен оказаться пустым:

var filter = PredicateBuilder.Get<Employee>();

 

 if (!string.IsNullOrWhiteSpace(firstName))

 {

         filter = filter.Or(e => e.FirstName.Contains(firstName));

 }

 

 if (!string.IsNullOrWhiteSpace(lastName))

 {

         filter = filter.Or(e => e.LastName.Contains(lastName));

 }

Если введены данные в оба поля, результатом работы PredicateBuilder окажется вот такое выражение:

e => e.FirstName.Contains(firstName) || e.LastName.Contains(lastName);

Если введено только firstName, от фильтра останется лишь первая часть:

e => e.FirstName.Contains(firstName);

Если оба поля пусты, сформированный фильтр тоже будет пустым (null).