我目前正在尝试将我们公司的框架从 EF6 转换为与 EF Core 兼容。我遇到了一些障碍。在 EF6 上运行良好的 EF“存储过程”现在在 EF Core 中的这段代码上失败:
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 Core 解决方案中,当输入参数 toolbarId
设置为 -1 时,此代码确实有效。所以我的猜测是问题出在 OR 子句另一边的某个地方。这就是我被困的地方。我想知道是否有人以前见过这个问题并且知道如何解决?或者 EF Core 与 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 显然不喜欢三元运算符。希望这对可能遇到此问题的任何其他人有所帮助。
关于c# - LINQ to Entities 在 .NET Core 中导致异常, "Value cannot be null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42653007/