Фильтрация после того, как я сделал ThenInclude в Entity Framework Core - PullRequest
1 голос
/ 20 сентября 2019

У меня есть несколько таблиц, таких как:

Пользователь -> UserRole -> Роль

Я использую EF Core 2

У меня есть запрос типа

_dbContext.User.Include(x=>x.UserRoles).ThenInclude(y=>y.Roles).Where(x.Active)

Таблица ролей также имеет активный (bool) столбец.

Как я могу отфильтровать роли, чтобы они возвращались только в том случае, если active - true.Нужно ли мне делать какие-то сложные условия, проходящие через все таблицы, так как у меня нет доступа к переменной ролей в моем предложении where.

Также Это будет проще в EF Core 3?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

По умолчанию EF Core не поддерживает фильтрацию в методе Include.Это также не поддерживается в EF Core 3.x

Отказ от ответственности : я являюсь владельцем проекта Entity Framework Plus

EF + Query IncludeFilter (бесплатный и с открытым исходным кодом) позволяет легко фильтровать включенные сущности.

ThenInclude пока не поддерживается, но вам просто нужно включить последний фильтр, чтобы иметь то же поведение.

Пример:

_dbContext.User
    .IncludeFilter(x=>x.UserRoles)
    .IncludeFilter(x=>x.UserRoles.SelectMany(y => y.Roles.Where(z => z.Active)))
1 голос
/ 20 сентября 2019

Не прямой ответ, заметьте, но если это «нормальное» требование, то есть вы всегда или почти всегда хотите возвращать только активные роли, вы можете посмотреть на глобальные фильтры, функцию, которая существуетначиная с EF Core 2.x.Глобальные фильтры позволяют вам устанавливать ограничения для каждой сущности, такие как «Active = true», «IsDeleted = false» и т. Д. Глобальные фильтры могут быть отключены, если вам нужно.

Что касается вашего ответа, тамНет очевидного способа сделать это, кроме как посмотреть на сущность Роль, отфильтровать ее, а затем спроецировать обратно на желаемую корневую сущность, AFAIK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...