Список фильтров, соответствующий всем идентификаторам

#c# #linq

#c# #linq

Вопрос:

У меня есть следующий запрос linq:

 FilteredProducts = AllProducts.Where(p => p.Attributes.Any(a => Filters.Contains(a.ID)));
  

Где Filters a List<int> . Приведенный выше запрос возвращает любые продукты, которые соответствуют любому из идентификаторов атрибутов в Filters .

Как я могу изменить это, чтобы возвращались только те продукты, которые соответствуют всем идентификаторам в Filters (он также может иметь другие атрибуты, но должен иметь любой атрибут, который имеет идентификатор в фильтрах).

Я думал об использовании Intersect вместо Any, но тогда мне пришлось бы использовать список атрибутов (чего я действительно не хочу делать)

Комментарии:

1. Вы могли бы изменить логику и использовать фильтры. Все внутри where . Непроверенный, но что-то вроде FilteredProducts = AllProducts.Where(p => Filters.All(fa=> p.Attributes.Any(a=> a.ID == fa)));

2. @Me.Name это прекрасно, если вы добавите это в качестве ответа, я отмечу это — я попытался изменить его, когда Janiec разместил ответ на использование all, но я не смог правильно понять внутреннюю логику

3. Ах, отлично, не был уверен, что синтаксис вручную выдержит, но тогда опубликую в качестве ответа 🙂

Ответ №1:

Возможное решение — отменить логические и тестовые фильтры.все внутри предложения products where

 AllProducts.Where(p => Filters.All(fa=> p.Attributes.Any(a=> a.ID == fa)));