Использование ThenInclude с условием в Entity Framework - PullRequest
0 голосов
/ 26 января 2020
return _companyRepository.GetAll().Where(company => company.Id == Id)
             .Include(company => company.offices.Where(o => o.IsActive))
             .ThenInclude(office => office.People.Where(p => p.IsFired))
             .ThenInclude(person => person.Children)
             .ToList(); 

Как я могу получить всех уволенных сотрудников всех активных офисов, используя Entity Framework Core?

Я получаю эту ошибку:

Где недопустимо предложение внутри Затем включите или включите

company.offices.Where(o => o.IsActive) 
office.People.Where(p => p.IsFired)

Я знаю, что не могу использовать Where внутри Include. вопрос в том, как фильтровать данные с помощью предложения Include?

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Это невозможно.

Я бы посоветовал поискать какие-либо из сторонних библиотек, перечисленных там, например:

EntityFramework.Filters

Запрос IncludeFilter

Как отфильтровать «Включить» сущности в структуру сущностей?

1 голос
/ 26 января 2020

Вам не нужно использовать Include, если вы используете свои данные в своем запросе. Include это просто способ отключить отложенную загрузку. Include определяет, будет ли свойство навигации заполнено данными или нет. Include не предназначен для фильтрации чего-либо.

Ваш запрос также вернет компании (с людьми), а не людей.

  return _companyRepository.GetAll().Where(company => company.Id == Id)
         .SelectMany(company => company.offices)
         .Where(o => o.IsActive)
         .SelectMany(office => office.People)
         .Where(p => p.IsFired) 
         .Include(person => person.Children)
         .ToList(); 

Это создает список с людьми, включая их детей. Последний элемент управления include говорит, что все дочерние элементы загружены этим запросом. Если вы удалите это include, вы все равно сможете получить доступ к дочерним элементам, но это будет загрузка по требованию или отложенная загрузка. Вы не заметите никакой разницы в функциях вашей программы, но в общении с вашим sql -сервером.

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