Необходимо запрашивать связанные данные с помощью ОДНОГО запроса

Это мой простой ERD

введите здесь описание изображения

Для данного schoolyearId я хочу загрузить все школьные классы + связанные ученики + связанные предметы.

  var schoolclasses = context.Schoolclasses
                .Include(s => s.Pupils)
                // How to get here the SubjectPupil + Subject for each pupil?
                .Where(s => s.SchoolyearId == schoolyearId);

Единственной особенностью этого ERD является отношение «многие ко многим» с учеником и предметом.

В EF7 я создал для него таблицу-мост, например SubjectPupil.

Как бы вы расширили мой запрос выше или сделали бы это правильно, чтобы получить данные о предмете для каждого ученика в приведенном выше запросе?


person Pascal    schedule 04.01.2016    source источник
comment
Опять же... Зачем закрывать этот вопрос? Любой комментарий?   -  person Pascal    schedule 05.01.2016


Ответы (2)


Для всех даунвотеров и близких идиотов без комментариев.

Из этого SO-ответа я узнал, что Intellisense не отображается для .ThenInclude() правильно. Таким образом, я думал, что запрос не работает:

Вложенное включение EF7 не отображается в Razor .net

Решение для получения данных, которые я хотел, заключается в следующем.

  var schoolclasses = await context.Schoolclasses
                .Include(x => x.Pupils)
                .ThenInclude(x => x.PupilsSubjects)
                .ThenInclude(x => x.Subject)
                .Where(s => s.SchoolyearId == schoolyearId)
                .ToListAsync();

Просто введите имя своего свойства в ThenInclude и создайте проект, он скомпилируется!

person Pascal    schedule 05.01.2016

Трудно сказать, не видя кода классов, но если, по сути, ваш вопрос заключается в том, как вы стремитесь загружать связанные объекты с нескольких уровней, вы можете сделать что-то вроде этого:

var schoolclasses = context.Schoolclasses
    .Include(s => s.Pupils.Select(pupil => pupil.SubjectPupil.Subject))
    .Where(s => s.SchoolyearId == schoolyearId);

Вот статья MSDN, описывающая это поведение.

person gerrod    schedule 05.01.2016
comment
Код класса — это установка, которую я указал на диаграмме. Существует только ОДИН способ настроить отношение 1:N или N:M в EF7. github.com/aspnet/EntityFramework/wiki/ Ваш .Select — это то, как он использовался в EF6, но EF7 с ThenInclude должен заменить его, но в моем случае это почему-то не работает. Можете ли вы попробовать это с ThenInclude, пожалуйста, может быть, я что-то не так делаю? - person Pascal; 05.01.2016
comment
Таким образом, он компилируется: .Include(s => s.Pupils.Select(pupil => ученик.PupilsSubjects.Select(c => c.Subject))), но я получаю исключение времени выполнения: SubQueryExpression не может быть преобразован в System .Linq.Expressions.MemberExpression - person Pascal; 05.01.2016
comment
Когда я добавляю ThenInclude(x => x.PupilsSubjects) после первого Include intellisense, я получаю список методов linq, но не мои конкретные типы? - person Pascal; 05.01.2016