2016-08-01 8 views
0

Ich habe zwei Abfragen, die wie folgt aussehen:LINQ LEFT OUTER JOIN - Objektverweis nicht auf eine Instanz eines Objekts festgelegt

var ret = (from x in _context.CustomUsers 
      where x.Name != currentUser 
      join c in _context.Claims on x.Name equals c.UserID into m 
      from c in m.DefaultIfEmpty() 
      select new UsersClients 
      { 
       UserName = x.Name, 
       DefaultClient = "N/A", 
       Role = null 
      }).ToList(); 

Dies ist eine Liste zurück, wie so:

User1 N/A null 
User2 N/A null 
User3 N/A null 

Hierzu :

var q = (from x in _context.Claims 
      where x.Default == true 
      select new 
      { 
       x.UserID, 
       x.ClientName 
      }).ToList(); 

Dies gibt eine Liste wie folgt:

User1 Client1 
User2 Client3 

Die erste Abfrage gibt Benutzer zurück, die in der zweiten Abfrage nicht vorhanden sind. Ich möchte dann einen linken äußeren Join auf beiden Ergebnissen machen, damit ich den Klienten von der zweiten Frage ziehen kann und wenn es leer ist. Ersetzen Sie es durch eine Zeichenfolge.

Meine dritte Abfrage sieht wie folgt aus:

var p = (from x in ret 
      join o in q on x.UserName equals o.UserID into l 
      from s in l.DefaultIfEmpty() 
      select new UsersClients 
      { 
       UserName = x.UserName, 
       DefaultClient = (s.ClientName == null ? "God dammit work" : s.ClientName), 
       Role = null 
      }).ToList(); 

Ich weiß, warum es nicht, ich weiß nur nicht, wie es zu beheben. Kann mir jemand helfen, so sieht das Endergebnis wie folgt aus:

User1 Client2 null 
    User2 Client1 null 
    User3 Work dammit null 
+0

Mögliches Duplikat [Kann nicht mehr links abfrage beitreten in C#/Linq] (http : //stackoverflow.com/questions/38430511/unable-to-query-multiple-left-join-in-c-linq) –

Antwort

3

Es scheint s ist bereits null wenn l leer ist. Sie muß also s für null überprüfen:

DefaultClient = (s == null || s.ClientName == null ? "God dammit work": s.ClientName), 

oder in C# 6 und mit null Koaleszierstruktur Betreibern:

DefaultClient = s?.ClientName ?? "God dammit work", 
+0

Dies gibt "Gott verdammt Arbeit" für Leute, die tatsächlich Kunden haben –

+0

Dies gibt nur "Gott verdammt Arbeit "wenn' s "oder" s.ClientName "ist null. Sind Sie sicher, dass Ihre Anfrage korrekt ist? Vielleicht ist die Verknüpfung von 'UserName' zu' UserID' falsch? –

+0

Ich habe gerade überprüft, der Beitritt ist in Ordnung und am ClientName ist nicht null. Das ist merkwürdig. Es tut nur für einen Benutzer –