Как сделать несколько включений более эффективными с EF Core 3.0 - PullRequest
2 голосов
/ 29 октября 2019

У меня есть запрос со многими многоуровневыми включениями:

var itemsToday = DatabaseContext.Items
                .Where(f => f.StartTime > DateTime.Today && f.StartTime < DateTime.Today.AddDays(1))
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType1)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType2)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType3)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType4)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType5)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType6)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType7)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType8)
                .Include(x => x.LocalStats).ThenInclude(x=>x.StatType9)
                .Include(x => x.LocalDetails)
...
                .OrderBy(f=>f.SomeOrderingCriterion);

Есть больше включений, чем это. Конечно, это приводит к тому, что EF Core 3.0 генерирует много соединений в запросе SQL, что означает, что выполнение занимает вечность (более 25 секунд для получения 200 записей).

Я пытался использовать формат .Include(x => x.LocalStats.StatType1) вместо Include и ThenInclude, но результаты совпадают.

Есть ли способ сделать это более эффективным? Документы предполагают, что:

LINQ-запросов с чрезвычайно большим числом Include операторов, возможно, потребуется разбить на несколько отдельных LINQ-запросов, чтобы избежать проблемы декартовых взрывов.

Но я не вижу никакого объяснения того, как на самом деле это сделать.

1 Ответ

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

Вы должны рассмотреть вопрос о отложенной загрузке этого запроса.

https://docs.microsoft.com/en-us/ef/core/querying/related-data

...