我们正在将一个旧的.NET Framework 4.6.1项目转换为.NET Core 2.2。在此过程中,我们已将Entity Framework软件包更新为Entity Framework Core,并将EntityFrameworkCore.SqlServer
更新为2.2.6。不幸的是,这导致我们现有的大量查询先前成功地成功抛出了NullReferenceException
。
这似乎与两种版本的EF在我们的SQL Server 2017 Db平台上生成SQL的方式不同有关。
现在引发此错误的实际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.CanView
}).ToList();
不幸的是,在每种情况下这样做都会对性能产生负面影响。