Другой вариант заключается в создании ProductFilter объекта, чтобы сделать фильтрацию для вас.
Дайте классу ProductFilter поле для каждой категории, которое можно фильтровать, которое предикаты каждого хранилища, и метод PassesFilter (Product p), который определяет, проходит ли p предикат для всех категорий, где был задан предикат, например
method PassesFilter(Product p):
if Category1Filter is not null:
if p does not pass Category1Filter:
return false
if Category2Filter is not null:
if p does not pass Category2Filter:
return false
return true
(Извините псевдо-код, я не делаю C# и это поздно)
Таким образом, вы можете использовать его так:
ProductFilter pf = new ProductFilter();
...
/*build up your filters for all categories that apply in this search...*/
pf.ColourFilter = (Product p) => { return p.Colour == "Red"; };
pf.PriceFilter = (Product p) => { return p.Price > 100.00; };
...
Products = repository.Products.Where(p => category == null || pf.PassesFilter(p));
Вы также можете легко реализовать PassesFilter метод по-разному обрабатывать OR вместо AND (или создавать класс для каждой реализации).
Я знаю, что использование предикатов в том, как я описал, позволит вам поставить предикат цены в поле предиката цвета, но я просто подумал, что я бы бросил этот пример там, чтобы проиллюстрировать концепцию использования объекта работа лямбды :-)
вам может понадобиться построить выражение лямбда ... см. Эту ссылку, возможно, это хороший старт http: // stackoverflow.com/questions/16240630/dynamic-add-new-lambda-expressions-to-create-a-filter –