У меня есть запрос со многими многоуровневыми включениями:
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-запросов, чтобы избежать проблемы декартовых взрывов.
Но я не вижу никакого объяснения того, как на самом деле это сделать.