我目前正致力于将我们的公司框架从EF6转换为与EF Core兼容。我遇到了一个障碍。 EF"存储过程"在EF6上的这段代码中,在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
? 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时,此代码 DOES 有效。所以我的猜测是问题在于OR子句的另一侧。那就是我被困的地方。我想知道是否有人之前已经看过这个问题并且知道如何修复它?或者EF Core与EF6有何不同?我已经尝试了几种不同的修复方法,并在几个地方寻找解决方案,并且已经空了。
答案 0 :(得分:4)
嗯,做了一点修修补补,发现了问题所在。
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不喜欢三元运算符。希望这有助于其他任何可能遇到此问题的人。