ef core 5.0 Как включить фильтрацию
Я пытаюсь использовать новую функцию Filtered on Include, но почему-то не понимаю. https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#preview-3
У меня есть товар с категориями. Мне нужно отфильтровать товары по названию / названию категории. Это отношения "многие ко многим".
В заголовке категории должно быть указано "Vlees". Но каким-то образом возвращаются ВСЕ 6 продуктов в базе данных, даже с неправильным названием Category.Title.
var products = await _context.Product
.Include(c => c.ProductCategories.Where(c => c.Category.Title.Contains(containsTitle)))
.ThenInclude(c => c.Category)
.ToListAsync();
1 ответ
Но каким-то образом возвращаются ВСЕ 6 товаров в базе
Это потому что вы спрашиваете
_context.Product
. Отфильтровано
Include
предназначен для фильтрации дочерних коллекций, а не основного запроса. Таким образом, вы получаете все продукты, но все они должны содержать только категории, прошедшие фильтр.
Вы, кажется, ожидаете, что EF возвращает только те товары, категории которых содержат "Vlees" в своих названиях, но это не цель фильтрации
Include
. Для этого вам необходимо отфильтровать сами продукты:
_context.Product
.Where(p => p.ProductCategories.Any(c => c.Category.Title.Contains(containsTitle)))
Это можно комбинировать с отфильтрованными
Include
s, но не обязательно. Если вы не фильтруете
Includes
вы получаете продукты, отфильтрованные по названию категории, но содержащие все категории в своих коллекциях.
Так отфильтровано
Include
дает вам свободу отдельно фильтровать результат запроса и дочерние коллекции.