2016-06-18 21 views
0

Ich bekomme eine 'Objektreferenz nicht gesetzt' mit dieser Art von Code unten. Problem tritt auf, wenn ich die DefaultIfEmpty() hinzufügen, um eine linke Verknüpfung zu machen. Aber ich muss im Bericht sehen, dass es keine PLACE für den 4. Artikel lst1 gibt. Wie kann ich eine Zeile erhalten, in der PLACEnull ist? Hier ist mein Codebeispiel von LinqPad.LINQ-Abfrage mit Liste <T> "Objektverweis nicht auf eine Instanz eines Objekts festgelegt."

Wenn Sie die Zeile auskommentieren: new ID(){id1 = 10152 , id2 = null} erhalten Sie den Fehler.

var Lst1 = new List<ID> 
{ 
    new ID(){id1 = 10152 , id2= 250}, 
    new ID(){id1 = 10152 , id2 = 1}, 
    new ID(){id1 = 10152 , id2= 106}, 
    //new ID(){id1 = 10152 , id2 = null} 
}; 
var Lst2 = new List<STORE> 
{ 
    new STORE() {sto1 = 10152 , sto2 = "General Store"} 
}; 
var Lst3 = new List<PLACE> 
{ 
    new PLACE() {pla1 = 250 , pla2 = "London"}, 
    new PLACE() {pla1 = 1 , pla2 = "Paris"}, 
    new PLACE() {pla1 = 106 , pla2 = "Miami"} 
}; 

var regsup = 
      (from l in Lst1 
      join st in Lst2 on l.id1 equals st.sto1 
      join pl in Lst3 on l.id2 equals pl.pla1 into pll 
      from plll in pll.DefaultIfEmpty() 
       select new 
       { 
        StoID = st.sto1, 
        Store = st.sto2, 
        PlaceID = plll.pla1, 
        Place = plll.pla2     
       }).Distinct(); 
       regsup.Dump(); 
} 
class ID 
{ 
    public decimal id1 { get; set; } 
    public decimal? id2 { get; set; } 
} 
class STORE 
{ 
    public decimal sto1{ get; set; } 
    public string sto2{ get; set; } 
} 
class PLACE 
{ 
    public decimal pla1{ get; set; } 
    public string pla2{ get; set; } 
} 
+0

Ja ich einige ähnliche Beispiele gefunden, aber nie, wann beginnen die Abfrage mit einer Liste . Frage wurde im folgenden von Chris gelöst. Die Verwendung des Ternärs auf der Quelle itsef (plll) ist die Lösung. Linqpad ist auch das Plus dieser Frage. Danke an Alle. G. – GYCO50

Antwort

2

Sie überprüfen müssen, um sicherzustellen, plll nicht null ist, bevor irgendetwas davon ist Eigenschaften zugreifen. DefaultIfEmpty() gibt ein Standardobjekt zurück, das in diesem Fall null ist.

Ihre select-Anweisung muss sein:

   select new 
       { 
        StoID = st.sto1, 
        Store = st.sto2, 
        PlaceID = plll != null ? plll.pla1 : 0, 
        Place = plll != null ? plll.pla2 : "" 
       }).Distinct(); 

oder C# 6, wenn verwenden, können Sie einfach haben:

PlaceID = plll?.pla1, 
Place = plll?.pla2 
+0

Danke Chris, genau was ich wollte! Ich habe es vorher mit diesem ternären Zustand versucht, aber am falschen Ort. Lösung ist effektiv zu überprüfen, PLL und nicht pll.pla1! Großartig für die C# 6 itp. Ich werde mich schnell daran machen. .Regards.Guy – GYCO50