#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)));