2016-11-11 5 views
1
beitreten

Lassen Sie uns sagen, ich habe diese Abfrage in SQL:LINQ: Kombinieren Sie kommen mit der linken

SELECT 
    .... 
FROM 
    TableA a 
    JOIN TableB b on a.Id = b.Id 

ich habe das ganz gut als Linq-Abfrage arbeiten:

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       select new MyObject {...}).ToList(); 

Aber jetzt will ich um auch eine linke Verbindung hinzuzufügen. In SQL:

SELECT 
    .... 
FROM 
    TableA a 
    JOIN TableB b on a.Id = b.Id 
    LEFT JOIN TableC c on a.Id2 = c.Id2 

Ich bin mir nicht sicher, wie dies in der Linq-Abfrage behandelt wird.

+0

Fügen Sie einfach eine Zeile nach Ihrer Tabelle hinzuB Join 'joinc in db.TableC auf a.Id equals c.Id' –

+0

Verhält sich das wie ein LINKER JOIN und schließt alle Zeilen aus TableA ein, auch wenn TableC nun übereinstimmende Datensätze hat (c .ID2 ist null)? –

+0

Sie wissen, wie man [linker äußerer Join in LINQ] schreibt (https://msdn.microsoft.com/en-us/library/bb311040.aspx#Anchor_2), nicht wahr? Schreiben Sie es einfach, wenn es keine andere Verknüpfung in der Abfrage gibt, z. 'Join c in TableC auf a.Id2 gleich c.Id2 in ac aus c in ac.DefaultIfEmpty()' –

Antwort

1

SQL LEFT JOIN Konzept ist eine ziemlich klobige Abstraktion, wenn Sie darüber nachdenken, was Sie wirklich tun wollen. Sie möchten wirklich für jeden TableA-Eintrag eine Liste mit TableC-Elementen haben, oder?

LINQ verwendet einen viel einfacheren (IMO) Weg, um diese Abstraktion darzustellen, weil es das Konzept verschachtelter, hierarchischer Objekte hat. Der Provider erzeugt einen LINKEN JOIN, aber er baut das Ergebnis auch in eine Objektstruktur auf, mit der man einfach arbeiten kann.

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       select new MyObject { 
        ... 
        TableCEntries = 
         from c in db.TableC 
         where c.Id == a.Id 
         select c  // or select specific values from c 
       }).ToList(); 

Wenn Sie wirklich Ihre Ergebnisse wollen die Art und Weise abgeflacht sie mit einer linken äußeren Verknüpfung wäre, könnten Sie dies tun:

var results = (from a in db.TableA 
       join b in db.TableB on a.Id equals b.Id 
       from c in db.TableC 
       where c.Id == a.Id 
       select new MyObject { 
        ... 
       }).ToList(); 

... aber Sie erhalten würden keine Einträge für TabelleA, in der keine Einträge für TableC vorhanden sind. Für dieses Verhalten müssten Sie hässliche Sachen mit group by/DefaultIfEmpty tun, wie in Ivan Stoev's link gezeigt.

+0

Dies ist jedoch nicht gleichbedeutend mit dem SQL 'LEFT OUTER JOIN'. –

+0

@IvanStoev: Siehe mein Update. – StriplingWarrior

+0

Ich sehe es (und stimme im Allgemeinen zu), aber das gleiche kann für die ursprüngliche OP-Abfrage (die Verbindung zwischen a und b) gesagt werden. Die Auswahl zwischen Join und Gruppen-Join liegt beim Query-Writer. Gert Arnolds Kommentar ist viel sinnvoller. Nur ein Gedanke :) Btw, der letzte Schnitt ist falsch (mit 'wo c.Id == a.Id') - siehe meinen Kommentar unter dem Beitrag. –

Verwandte Themen