Мы конвертируем старый проект .NET Framework 4.6.1 в .NET Core 2.2. В процессе мы обновили наши пакеты Entity Framework до Entity Framework Core и EntityFrameworkCore.SqlServer
до 2.2.6. К сожалению, это привело к тому, что большое количество наших существующих запросов, которые ранее успешно выполнялись, выдают NullReferenceException
.
Это, похоже, связано с различиями в том, как две версии EF генерируют SQL на нашемПлатформа SQL Server 2017 Db.
Фактические запросы EF, которые теперь выдают эту ошибку, обычно имеют такую природу:
var query = from c in _workspaceContext.Container
join ch in _workspaceContext.ContainerHierarchy on c.ContainerPk equals ch.AncestorFk
join a in _workspaceContext.Asset on ch.ContainerFk equals a.ParentContainerFk
join cu in _workspaceContext.ContainerUser on new { ContainerKey = ch.ContainerFk, UserKey = userKey } equals new { ContainerKey = cu.ContainerFk, UserKey = cu.UserFk } into cus
from cu in cus.DefaultIfEmpty()
join co in _workspaceContext.ContainerOrganisation on ch.ContainerFk equals co.ContainerFk into cos
from co in cos.DefaultIfEmpty()
where containerIds.Contains(c.Id) && !a.IsHidden && a.SentByUserFk == null
select new ContainerAsset
{
TopLevelContainerId = c.Id,
AssetKey = a.AssetPk,
ContainerKey = ch.ContainerFk,
AssetName = a.Name,
CanView = (c.ContainerTypeFk == 3)
};
query = query.GroupBy(x => new
{
x.TopLevelContainerId,
x.ContainerKey,
x.CanView
}).ToList();
Есть какие-либо идеи о том, почему это поведение изменилось между EF Core и EF 6? Я могу решить эту проблему, загрузив выражение первого запроса в память перед выполнением GroupBy во втором запросе, например, так:
query = query.ToList().GroupBy(x => new
{
x.TopLevelContainerId,
x.ContainerKey,
x.CanView
}).ToList();
К сожалению, выполнение этого в каждом сценарии отрицательно скажется на производительности.