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

Это можно комбинировать с отфильтрованными Includes, но не обязательно. Если вы не фильтруете Includes вы получаете продукты, отфильтрованные по названию категории, но содержащие все категории в своих коллекциях.

Так отфильтровано Include дает вам свободу отдельно фильтровать результат запроса и дочерние коллекции.

Другие вопросы по тегам