EF Core 3.0. Include не работает должным образом и Super Slow - PullRequest
1 голос
/ 03 ноября 2019

У меня есть такой запрос linq в EF Core 2.0, он работает как есть, но когда я обновляюсь до EF Core 3.0, он всегда истекает. Я нашел проблему в query = query.Where(x => x.Questions);. Мой вопрос: я хотел бы вернуть курс с фильтрующими вопросами, такими как только Take (10) или с. Где условие, которое отображает только определенный диапазон, а не все вопросы.

var query = _courseRepository.Table;
query = query.Where(x => x.Id == id);
query = query.Include(x => x.Questions);
query = query.Include(x => x.CourseYear);
query = query.Include(x => x.CourseSubject);
query = query.Include(x => x.Instructors).ThenInclude(y => y.User);
query = query.Include(x => x.Instructors).ThenInclude(y => y.Course);
query = query.Include(x => x.Instructors).ThenInclude(y => y.CourseClass);
query = query.Include(x => x.CourseSections);
query = query.Include(x => x.CourseSections).ThenInclude(y => y.Lessons);
query = query.Include(x => x.CourseClasses);
query = query.Include(x => x.UserCourses).ThenInclude(y => y.User);
var result = query.FirstOrDefault();

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

EFCore 3.0 изменил запрос (запросы), сгенерированный с помощью .Include(), и вы столкнулись с проблемой декартового взрыва ;

В частности, в Документах теперь есть следующее предупреждение красного цвета:

Внимание

Начиная с версии 3.0.0, каждое включение будет вызывать добавление дополнительного JOIN к запросам SQL, создаваемым реляционными поставщиками, тогда как предыдущие версии генерировали дополнительные запросы SQL. Это может значительно изменить производительность ваших запросов, в лучшую или худшую сторону. В частности, запросы LINQ с чрезвычайно большим числом операторов включения могут быть разбиты на несколько отдельных запросов LINQ, чтобы избежать проблемы декартового взрыва.

Решение состоит в том, чтобы выполнить несколько запросов сейчассогласно документам.

Его супер неудачная загрузка графов сущностей, общая для сильно нормализованных данных, настолько неэффективна, но это ее текущее состояние с EF.

См .: Загрузка Данные и прокручивайте, пока не увидите красный.

0 голосов
/ 12 ноября 2019
var query = _courseRepository.Table
.Include(x => x.Questions)
.Include(x => x.CourseClasses)
.Include(x => x.CourseYear)
.Include(x => x.CourseSubject);

var course = await query.FirstOrDefaultAsync(x => x.Id == id);

query.Include(x => x.Instructors).ThenInclude(y => y.User).SelectMany(a => a.Instructors).Load();
query.Include(x => x.Instructors).ThenInclude(y => y.Course).SelectMany(a => a.Instructors).Load();
query.Include(x => x.Instructors).ThenInclude(y => y.CourseClass).SelectMany(a => a.Instructors).Load();

query.Include(x => x.CourseSections).ThenInclude(y => y.Lessons).SelectMany(a => a.CourseSections).Load();

query.Include(x => x.UserCourses).ThenInclude(y => y.User).SelectMany(a => a.UserCourses).Load();
...