2017-03-07 77 views
4

我目前正在努力将我们的公司框架从EF6转换为与EF Core兼容。我遇到了一块障碍。这只是正常的EF6的EF“存储过程”现在没有在EF核心的代码块上:LINQ to Entities在.NET Core中导致异常“Value can not be null”

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

当toolbarId!= -1时,MENU_MenuFolders或MENU_MenuToolbar_MenuFolders为null吗? –

+0

不,toolbarId == -1是我们的默认情况,toolbarId的任何正值应该“减少”可以说回来的记录。我已经尝试在LINQPad 4中运行相同的查询,并且在那里没有问题.... –

+0

在工作场景(称为.NET 4.5)中使用的EF版本是什么 - EF6或EF Core?换句话说,你是否真的改变了EF? –

回答

3

那么,做了一点点修补它,发现问题是什么。

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(); 

在或之后where条款,显然是.NET的核心并不像三元运算符。希望这可以帮助任何可能遇到此问题的人。

+1

* EF Core不喜欢三元运算符* - LOL。这只是当前EF核心错误中的一个。 –

+2

星期一早上我一直在这....感谢EF核心!大声笑 –

相关问题