我目前正在尝试尝试将我们的公司框架从EF6转换为与EF Core兼容。我遇到了一个块。在EF6上正常工作的EF"存储过程"现在在EF核心中的代码块上失败:
var allFolderAncestors = (from f in context.MENU_MenuFolders
from mtf in context.MENU_MenuToolbar_MenuFolders
.Where(x => x.MenuFolderId == f.Id
|| x.MenuFolderId == f.ParentFolderId)
.DefaultIfEmpty()
where (toolbarId == -1
|| (mtf == null
? false
: mtf.MenuToolbarId == toolbarId)
)
&& f.Id != 0
select new
{
AncestorFolderId = f.Id,
AncestorParentFolderId = f.ParentFolderId,
Id = f.Id,
ParentFolderId = f.ParentFolderId
}).ToList();
试图执行此代码行会导致以下异常消息:
Value cannot be null. Parameter name: left
在我们的.NET核心解决方案中,此代码 di 在将输入参数toolbarId
设置为-1时工作。所以我的猜测是问题在于或子句的另一侧。那就是我卡住的地方。我想知道是否有人以前看过这个问题并且知道如何解决?还是EF核心与EF6有何不同?我尝试了几个不同的修复程序,并在几个地方寻找解决方案,并空了。
好吧,对它进行了更多修补,并发现了问题是什么。
var allFolderAncestors = (from f in context.MENU_MenuFolders
from mtf in context.MENU_MenuToolbar_MenuFolders
.Where(x => x.MenuFolderId == f.Id
|| x.MenuFolderId == f.ParentFolderId)
.DefaultIfEmpty()
where (toolbarId == -1
|| (mtf != null && mtf.MenuToolbarId == toolbarId))
&& f.Id != 0
select new
{
AncestorFolderId = f.Id,
AncestorParentFolderId = f.ParentFolderId,
Id = f.Id,
ParentFolderId = f.ParentFolderId
}).ToList();
在OR之后的where
子句中,显然.NET Core不喜欢三元运算符。希望这对可能遇到这个问题的其他任何人都有帮助。