Обновление с Entity Framework Core 2.2 до 3+ (проблемы со многими включает) - PullRequest
1 голос
/ 09 января 2020

Начиная с версии 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.

1 Ответ

0 голосов
/ 04 февраля 2020

Похоже, вы столкнулись с этой проблемой: https://github.com/dotnet/efcore/issues/19571

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...