2015-11-13 13 views
1

Я хочу построить запрос с условием для свойств фильтра, когда у них есть значение (а не null). Для использования нескольких фильтров должна использоваться комбинация И.Создайте IQueryable из нескольких предикатов

Как можно комбинировать/добавлять каждый предикат, когда значение свойства соответствует не null, чтобы получить окончательный запрос, готовый для фильтрации?

IQueryable<Customer> filter = null; 

Expression<Func<Customer, bool>> predicatetest1 = res => res.test1 == request.test1; 
Expression<Func<Customer, bool>> predicatetest2 = res => res.test2 == request.test2; 
Expression<Func<Customer, bool>> predicatetest3 = res => res.test3 == request.test3; 

if (request.test1 != null) 
{ 
    // add the above predicate to the filter 
} 

if (request.test2 != null) 
{ 
    // add the above predicate to the filter 
} 

if (request.test3 != null) 
{ 
    // add the above predicate to the filter 
} 

ответ

0
IQueryable<Customer> filter = Context.Customers; 

if (request.test1 != null) 
{ 
    filter = filter.Where(predicatetest1); 
} 

if (request.test2 != null) 
{ 
    filter = filter.Where(predicatetest2); 
} 

if (request.test3 != null) 
{ 
    filter = filter.Where(predicatetest3); 
} 

var customers = filter.ToList(); 

Следующая будет эквивалентно, когда все 3 объекта, где не нулевой

Context.Customers.Where(predicatetest1).Where(predicatetest2).Where(predicatetest3).ToList(); 
+0

Когда все 3 свойства не обнулить это всегда будет перезаписывать до того установлен фильтр. Я хочу, чтобы все 3 фильтра использовались в стиле И. – Elisabeth

+0

@Elisabeth Нет, это приведет к цепочке методов Where, приводящих к стилю AND. – Jehof

+0

действительно? но он всегда переписывает существующую переменную ??? Я просто пытаюсь это сделать ... – Elisabeth