Как использовать запрос «Где» в запросе «Включить» и «Выбрать» в Entity Framework 6 - PullRequest
0 голосов
/ 12 октября 2019

В моей базе данных у меня есть 3 таблицы: экзамены, экзаменационные места, агенты. Идентификатор каждого экзамена в таблице «Экзамены» - это внешний ключ в таблице «ExamPlaces», а идентификатор каждого места экзамена - это внешний ключ в таблице «Агенты». Я хочу вернуть все экзамены от определенного агента. Я попытался вернуть экзамены следующим образом:

return _db.Exams
            .Include(e => e.ExamPlaces.Select(a => a.Agents
                .Where(agent => agent.AgentId == supervisorId))).ToList();

Но я получил ошибку ниже:

Выражение «Включить путь» должно ссылаться на свойство навигации, определенное для типа. Используйте пунктирные пути для ссылочных свойств навигации и оператор Select для свойств навигации коллекции. Имя параметра: путь

Можно ли использовать предложение "Где", например, как я сделал с "Включить" для извлеченных данных?

Оценить

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Как вы заметили, EF 6 не поддерживает фильтрацию в методе Include.

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

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

Чтобы использовать его, вам просто нужно заменить все «Фильтры»по «Включить фильтр». Вам также необходимо использовать IncludeFilter на каждом уровне.

Пример:

return _db.Exams
            .IncludeFilter(e => e.ExamPlaces)
            .IncludeFilter(e => e.ExamPlaces.Select(a => a.Agents
                .Where(agent => agent.AgentId == supervisorId))).ToList();
1 голос
/ 12 октября 2019

Включение не влияет на то, какие записи возвращаются. Это позволяет быстро загружать указанные свойства навигации. По сути, это способ сказать: «Да, я хочу несколько экзаменов, но позже я также буду использовать соответствующие места экзаменов, так что продолжайте и получите их из базы данных сейчас, чтобы сэкономить время». Это не имеет ничего общего с Where.

В данном конкретном случае, где трудно работать. Это не имеет ничего общего с Включить. Если вы действительно хотите начать с _db.Exams и использовать Where, я думаю, вы могли бы поместить Join где-нибудь перед Where, чтобы заставить его работать.

Однако, подумайте о запросе с другой стороны. У вас уже есть агент, который вы хотите. У этого агента есть коллекция ExamPlaces, а у каждого ExamPlaces есть коллекция ExamPlace. Вам просто нужно объединить их в один список. Примерно так должно работать (не проверяется на синтаксические ошибки):

return _db.Agents
        .Find(supervisorId)
        .ExamPlaces
        .SelectMany(p => p.Exams)
        .Include(e => e.ExamPlaces.Select(p => p.Agents))
        .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...