2016-08-25 4 views
2

ich möchte linken äußeren beitreten in Dynamic Linq, aber ich kann nicht die Syntax richtig. In SQL würde es so aussehen:C# - Dynamic Linq linken äußeren Join auf mehrere Eigenschaften

SELECT col1, col2, col3 from tableA as a 
LEFT OUTER JOIN tableB as b on a.col1 = b.col1 AND a.col2 = b.col2 AND a.col3 = 1 

In dynamischen Linq ich dies versucht:

dbContext.tableA 
.GroupJoin(tableB, col1 == tableA.col1 && col2 == tableA.col2 && col3 == 1) 
.Select('new(col1, col2, col3)'); 

Der dritte Parameter (Spalte) beitreten wird nur hart codiert, weil es nicht von tableB kommt. Was ist der richtige Linq-Code?

BEARBEITEN: Es ist keine doppelte Frage. Ich bin auf der Suche nach Syntax, die mit dynamischen LINQ funktioniert, nicht mit normalen linq

+0

Was ist das Problem, das Sie hier haben? Ist es nur die Syntax, die Sie brauchen? Probieren Sie die [Dokumentation] (https://msdn.microsoft.com/en-us/library/bb534297%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) – slawekwin

+0

Mögliches Duplikat von [LEFT OUTER JOIN in LINQ] (http://stackoverflow.com/questions/3404975/left-outer-join-in-linq) – uTeisT

+1

@Oktay - aus der Dokumentation der dynamischen linq scheint es nicht, als hätten sie eine 'GroupJoin' Überladung –

Antwort

0

Normalerweise für Joins und vor allem für Links Joins ich Statement-Syntax verwenden.

Nicht getestet, aber in etwa so aussehen würde:

var result = from a in tableA 
      from b in tableB.Where(x => x.col1 == a.col1 && x.col2 == a.col2 && a.col3 == 1).DefaultIfEmpty() 
      select new { a.col1, a.col2, b.col3 }; 

Durch einen .DefaultIfEmpty tun() auf dem von tableB beitreten, wird es dies als LEFT JOIN behandeln. Wenn Sie das .DefaultIfEmpty() weglassen, verhält es sich wie ein innerer Join.

+0

Danke! Ich kann die Anweisungssyntax nicht verwenden, weil die Zeichenfolge, die ich in select() übergebe, dynamisch ist und in der Funktion als Parameter enthalten ist. –

+0

Sie müssen nicht einen anonymen Typ zurückgeben, können Sie eine neue MyObject {First = col1, etc} alternativ tun, habe ich es nicht versucht, aber wenn die Funktion ein Datenadapter ist, können Sie versuchen, die Funktion auszuwählen Mit einem .Invoke() –

+0

sieht es hier aus wie ein gutes Beispiel von .SelectMany mit einem linken Join. http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-ususing-linq-extension-methods –

Verwandte Themen