Ich arbeite an einer Linq-Abfrage, die eine linke Join mit einer Nullable-Spalte hat. Diese Verbindung wird zwischen einem BackgroundColors Tabelle mit einer int
Id 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.
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
Versuchen Sie 'var test = backgroundColors.Where (x => x. Id == 1) .ToList(); '. Erhalten Sie die gleiche Ausnahme? –
@Ivan Stoev Ich habe es versucht und 'test' wurde gleich der ersten Zeile in der BackgroundColors-Tabelle gesetzt –