Исключение NullReferenceException, возникающее при выполнении запросов GroupBy через Entity Framework Core, который работал в более старых версиях Entity Framework - PullRequest
0 голосов
/ 08 ноября 2019

Мы конвертируем старый проект .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();

К сожалению, выполнение этого в каждом сценарии отрицательно скажется на производительности.

...