2

Ich arbeite an einer Linq-Abfrage, die eine linke Join mit einer Nullable-Spalte hat. Diese Verbindung wird zwischen einem BackgroundColors Tabelle mit einer intId Spalte gemacht, und eine Tabelle namens MenuFolders, die eine int? Spalte BackgroundColorId genannt hat. In MenuFolders wird für jede Zeile die BackgroundColorId auf null festgelegt.LINQ Links Join auf Nullable-Spalte geben Null Referenz Ausnahme

Jeder linke Join in meiner Abfrage funktioniert bis zum Join dieser beiden Tabellen. Wenn ich den link von linkes link mit menuFolders auskommentiere, generiert die Abfrage eine NullReferenceException - "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt." Aber ich dachte, .DefaultIfEmpty() soll dafür sorgen. Hier ist mein Code. Beachten Sie, dass die SQL-Äquivalent funktioniert nur gut, wenn auf SQL Server ausgeführt wird:

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

ich auch anstelle von Lambda-Ausdrücke tun diese Abfrage mit Standard-Linq habe versucht, aber es gibt mir immer noch den gleichen Fehler.

nahm ich einen Blick auf diesen Link früher für Hilfe, um diese Frage zu beantworten, aber seine Antwort für mich nicht funktioniert hat: LINQ Join query (with nullable ref between table)

EDIT: Ich habe versucht, Werte in der BackgroundColorId Spalte von null Wechsel in Integer Werte, und ich bekomme immer noch den gleichen Fehler.

+0

Wenn Sie die DefaultIfEmpty-Erweiterung verwenden, ist der Standardwert null, wenn das Objekt eine Klasse ist. Sie können jedoch optional einen Standardwert als Methodenparameter angeben. In diesem Fall glaube ich nicht, dass Sie die DefaultIfEmpty-Erweiterung richtig verwenden. Ich bin mir nicht sicher, wie der Rest Ihres Codes aussieht, aber ich schätze, dass Sie wahrscheinlich ohne ihn auskommen könnten. Siehe: [Enumerable.DefaultIfEmpty] (https://msdn.microsoft.com/en-us/library/bb360179 (v = vs.110) .aspx) – returnsvoid

+0

Versuchen Sie 'var test = backgroundColors.Where (x => x. Id == 1) .ToList(); '. Erhalten Sie die gleiche Ausnahme? –

+0

@Ivan Stoev Ich habe es versucht und 'test' wurde gleich der ersten Zeile in der BackgroundColors-Tabelle gesetzt –

Antwort

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

Habe ich es schließlich heraus, Joins in Tabellen einige meiner geführt, die, während sie nicht leer waren, da null Reihen waren, die ich verweisen, damit die Ausnahme verursacht. Hoffentlich hilft das jemand anderem, wenn sie auf dieses Problem stoßen.