2010-09-25 8 views

Antwort

37

normalerweise in LINQ mit Gruppe modelliert verbindet, manchmal in Verbindung mit DefaultIfEmpty und SelectMany schließt sich links genommen wird:

var leftJoin = p.Person.Where(n => n.FirstName.Contains("a")) 
         .GroupJoin(p.PersonInfo, 
            n => n.PersonId, 
            m => m.PersonId, 
            (n, ms) => new { n, ms = ms.DefaultIfEmpty() }) 
         .SelectMany(z => z.ms.Select(m => new { n = z.n, m)); 

Das gibt eine Folge von Paaren (n, m) wobei n der Eintrag aus p.Person und m der Eintrag aus p.PersonInfo, aber m ist wird null sein, wenn keine Übereinstimmungen vorhanden sind.

(Es ist völlig ungetestet, btw - aber sollten Sie die Idee geben sowieso :)

+1

erste anonyme Projektion funktioniert nicht - Compiler sagt 'Invalid anonyme Typ Mitglied Deklarator. Anonyme Typ-Member müssen mit einer Member-Zuweisung, einem einfachen Namen oder Member-Zugriff ' – chester89

+1

@ chester89: Fixed, thanks erklärt werden. –

11

Für LEFT OUTER versuchen Join-Abfrage Im Anschluss an. Dieses getestet wird

var leftJoin = Table1 
       .GroupJoin(
           inner: Table2, 
        outerKeySelector: t1 => t1.Col1, 
        innerKeySelector: t2 => t2.Col2, 
         resultSelector: (t1, t2Rows) => new { t1, t2Rows.DefaultIfEmpty() } 
       ) 
       .SelectMany(z => 
        z.t2Rows.Select(t2 => 
         new { t1 = z.t1, t2 = t2 } 
        ) 
       ); 
3

Wenn jemand über diese Frage kommt und will eine Erweiterung Methode, dies zu erreichen, habe ich ein den gleichen Ansatz wie die anderen Antworten verwenden. Es hat dieselbe Signatur wie die normale Join-Erweiterungsmethode.

Verwandte Themen