LINQ to 实体导致 .NET Core 中出现异常,"值不能为空"



我目前正在尝试尝试将我们的公司框架从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不喜欢三元运算符。希望这对可能遇到这个问题的其他任何人都有帮助。

最新更新