C# 可为null的列上的LINQ左连接导致null引用异常

C# 可为null的列上的LINQ左连接导致null引用异常,c#,linq,linq-to-entities,left-join,nullreferenceexception,C#,Linq,Linq To Entities,Left Join,Nullreferenceexception,我正在处理一个linq查询,它有一个涉及可空列的左连接。此联接是在具有intId列的BackgroundColors表和名为MenuFolders的表之间进行的,该表具有名为int?列的BackgroundColorId。在菜单文件夹中,每一行的BackgroundColorId都设置为null 我查询中的每个左连接都可以正常工作,直到这两个表上的连接为止。当我取消对BackgroundColor left与menuFolders的连接的注释时,查询会生成一个NullReferenceExcep

我正在处理一个linq查询,它有一个涉及可空列的左连接。此联接是在具有
int
Id列的BackgroundColors表和名为MenuFolders的表之间进行的,该表具有名为
int?
列的BackgroundColorId。在菜单文件夹中,每一行的BackgroundColorId都设置为
null

我查询中的每个左连接都可以正常工作,直到这两个表上的连接为止。当我取消对BackgroundColor left与menuFolders的连接的注释时,查询会生成一个NullReferenceException-“对象引用未设置为对象的实例。”,但我认为
。DefaultIfEmpty()
应该解决这个问题。这是我的密码。请记住,在SQL Server上运行时,SQL等效程序工作正常:

  var folderStructure = (from fa in folderAncestorsLanguage
                         from mf in menuFolders.Where(x => x.Id == fa.Id)
                         from mtf in menuTlbrMenuFolders.Where(x => (x.MenuToolbarId == toolbarId && x.MenuFolderId == fa.Id)).DefaultIfEmpty()
                         from mbc in backgroundColors.Where(x => x.Id == mf.BackgroundColorId).DefaultIfEmpty()//Left Join that is causing an exception
                         from lmf in languageMenuFolders.Where(x => x.MenuFolderId == mf.Id).DefaultIfEmpty()
                         where (mf.StatusId == 1)
                         select new
                         {
                             Id = mf.Id,
                             Name = lmf.Name,
                             DefaultName = mf.Name,
                             Description = mf.Description,
                             FolderId = fa.ParentFolderId,
                             OrderIndex = mf.OrderIndex,
                             IconUrl = mf.IconUrl,
                             IsFramework = mf.IsFramework,
                             BackgroundColor = mbc.HexCode == null ? null : mbc.HexCode,
                             IsModifiable = mf.IsModifiable,
                             iconCls = mf.iconCls
                         }).ToList();  
我也尝试过使用标准linq而不是lambda表达式进行此查询,但它仍然会给我相同的错误

var folderStructure = (from fa in folderAncestorsLanguage
                     from mf in menuFolders.Where(x => x.Id == fa.Id)
                     from mtf in menuTlbrMenuFolders.Where(x => (x.MenuToolbarId == toolbarId && x.MenuFolderId == fa.Id)).DefaultIfEmpty()
                     from mbc in backgroundColors.Where(x => x.Id == mf.BackgroundColorId).DefaultIfEmpty()//Left Join that is causing an exception
                     from lmf in languageMenuFolders.Where(x => x.MenuFolderId == mf.Id).DefaultIfEmpty()
                     where (mf.StatusId == 1)
                     select new
                     {
                         Id = mf.Id,
                         Name = (lmf == null) ? null : lmf.Name,
                         DefaultName = mf.Name,
                         Description = mf.Description,
                         FolderId = fa.ParentFolderId,
                         OrderIndex = mf.OrderIndex,
                         IconUrl = mf.IconUrl,
                         IsFramework = mf.IsFramework,
                         BackgroundColor = (mbc == null) ? null : mbc.HexCode,
                         IsModifiable = mf.IsModifiable,
                         iconCls = mf.iconCls
                     }).ToList();
我在前面查看了此链接以帮助回答此问题,但其答案对我不起作用:

编辑:我尝试将BackgroundColorId列中的值从
null
更改为整数值,但仍然得到相同的错误

var folderStructure = (from fa in folderAncestorsLanguage
                     from mf in menuFolders.Where(x => x.Id == fa.Id)
                     from mtf in menuTlbrMenuFolders.Where(x => (x.MenuToolbarId == toolbarId && x.MenuFolderId == fa.Id)).DefaultIfEmpty()
                     from mbc in backgroundColors.Where(x => x.Id == mf.BackgroundColorId).DefaultIfEmpty()//Left Join that is causing an exception
                     from lmf in languageMenuFolders.Where(x => x.MenuFolderId == mf.Id).DefaultIfEmpty()
                     where (mf.StatusId == 1)
                     select new
                     {
                         Id = mf.Id,
                         Name = (lmf == null) ? null : lmf.Name,
                         DefaultName = mf.Name,
                         Description = mf.Description,
                         FolderId = fa.ParentFolderId,
                         OrderIndex = mf.OrderIndex,
                         IconUrl = mf.IconUrl,
                         IsFramework = mf.IsFramework,
                         BackgroundColor = (mbc == null) ? null : mbc.HexCode,
                         IsModifiable = mf.IsModifiable,
                         iconCls = mf.iconCls
                     }).ToList();

我最终发现,我的一些连接导致表不是空的,但有空的行,我正在引用这些行,从而导致异常。如果其他人遇到此问题,希望这对他们有所帮助。

使用DefaultIfEmpty扩展时,如果对象是类,则默认值将为null,但是,您可以选择指定默认值作为方法参数。话虽如此,在本例中,我不认为您正确使用了DefaultIfEmpty扩展——我不确定您的其余代码是什么样子,但我猜您可能不需要它。请参阅:Try
var test=backgroundColors.Where(x=>x.Id==1.ToList()。你也遇到了同样的异常吗?@Ivan Stoev我试过了,而且
test
被设置为等于BackgroundColors表中的第一行,通常像这样的问题都会作为的重复关闭,这很可能也会发生在你的问题上。由于查询看起来正常,因此只有您可以调试并查看问题所在。您可以发布异常堆栈跟踪吗?\usp\u菜单\u MenuStructure\u Get.cs:System.Linq.Enumerable.WhereSelectEnumerableInterator
2.MoveNext()at System.Collections.Generic.List
1..ctor(IEnumerable
1 collection)at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)在d:\Dev\src\Framework\Server\EntityFrameworkModel\Programmability\storedprocess\usp\u MENU-MENU-structure\u-Get.cs中的EntityFramework.usp\u-MENU-structure\u-Get.Execute(字典'2个参数)中:第197行在EntityFramework.DataseProgrammabilitybase.Execute中(IDbDataParameter[]parameters)