Начиная с версии 3.0.0, каждое включение будет вызывать добавление дополнительного JOIN к SQL запросам, созданным реляционными провайдерами, тогда как предыдущие версии генерировали дополнительные SQL запросы. Это может значительно изменить производительность ваших запросов, в лучшую или в худшую сторону. В частности, запросы LINQ с чрезвычайно большим числом операторов включения могут быть разбиты на несколько отдельных запросов LINQ, чтобы избежать проблемы декартового взрыва.
https://docs.microsoft.com/en-us/ef/core/querying/related-data
Что здесь за мысль? Как писать большие запросы LINQ с EF Core 3+? У меня есть запрос LINQ, который прекрасно работает с EF Core 2.2.6, но который истекает на EF Core 3.1.
var data = await _repository.All<TransportModeEntity>()
.Include(im => im.TransportMode_InsuranceType).ThenInclude(it => it.InsuranceType)
.Include(im => im.TransportMode_PackingMode).ThenInclude(pm => pm.PackingMode)
.Include(im => im.TransportMode_StateOfGoods).ThenInclude(sg => sg.StateOfGoods)
.Include(im => im.TransportMode_LoadingMode).ThenInclude(lm => lm.LoadingMode)
.Include(im => im.TransportMode_BulkTypes).ThenInclude(bt => bt.BulkType)
.Include(im => im.TransportMode_VesselTypes).ThenInclude(vt => vt.VesselType)
.Include(im => im.TransportMode_VesselAges).ThenInclude(vt => vt.VesselAge)
.Include(im => im.TransportMode_VesselOwnerships).ThenInclude(vo => vo.VesselOwnership)
.Include(im => im.TransportMode_FreightServices).ThenInclude(fs => fs.FreightService)
.Include(im => im.TransportMode_SurCharges).ThenInclude(sc => sc.SurCharge)
.Include(im => im.TransportMode_TemperatureControlled).ThenInclude(tc => tc.TemperatureControlled)
.Include(im => im.TransportMode_ExtraClauses).ThenInclude(ec => ec.ExtraClause)
.Include(im => im.TransportMode_DangerousGoods).ThenInclude(dg => dg.DangerousGoods)
.Include(im => im.TransportMode_LiftRates).ThenInclude(lr => lr.LiftRate)
.Include(im => im.TransportMode_WmRates).ThenInclude(wr => wr.WmRate)
.Include(im => im.TransportMode_WeightConversions).ThenInclude(wc => wc.WeightConversion)
.Include(im => im.TransportMode_CountryExcluded).ThenInclude(ce => ce.ProfileCountry)
.Include(im => im.TransportMode_StateExcluded).ThenInclude(se => se.ProfileState)
.ToListAsync();
Каждый «TransportMode_XXXX» представляет собой виртуальную коллекцию ICol определенного типа. Конечно, запрос довольно большой, но, как было объяснено ранее, он отлично работает в EF Core 2.2.6. Что Microsoft подразумевает под «запросами LINQ с чрезвычайно большим числом операторов включения, возможно, необходимо разбить их на несколько отдельных запросов LINQ»? Как следует go делать это наилучшим образом с точки зрения производительности и приведет ли рефакторинг к равной, лучшей или худшей производительности по сравнению с тем, как это работает в EF Core 2.2.6?
Для теперь, пока я не нашел хороший путь вперед, я только обновил API до ASP. NET Core 3.1, но остался с EF Core 2.2.6.