2010-08-23 16 views
15

Ich habe Probleme mit einer Join/Where-Klausel mit einer eher einfachen SQL SELECT-Anweisung.LINQ Join where Klausel

Ich versuche, eine Liste der Produktinformationen von tb1 mit der Where-Bedingung hinter in tbl2 zu finden, aber das muss durch drei verschiedene Spalten verbunden sein.

so würde die SQL aussehen etwas entlang der Linien von:

SELECT  tb1.* 
FROM   tb2 INNER JOIN 
         tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
         tb2.Col3 = tb1.Col3 
WHERE  (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string) 

COLX ist die Haupt-where-Klausel mit der Zeichenfolge als Parameter übergeben werden; Alle anderen Spalten befinden sich in den Kontexten.

Wie implementieren Sie mehrere Joins mit einer Where-Klausel?

Und schiebt in die richtige Richtung, sehr geschätzt.

Antwort

42

auf mehrere Feld in LINQ beizutreten, müssen Sie die Spalten einen neuen anonymen Typen erstellen enthält, die Sie und dann vergleichen mögen verwenden, dass anonyme Art in der Join:

var results = from t1 in context.tb1 
       join t2 in context.tb2 
       on new { t1.Col1, t1.Col2, t1.Col3 } equals 
        new { t2.Col1, t2.Col2, t2.Col3 } 
       where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString 
       select t1; 

Und hier ist das äquivalent Lambda Syntax:

var results = context.tb1.Join(
        context.tb2, 
        t1 => new { t1.Col1, t1.Col2, t1.Col3 }, 
        t2 => new { t2.Col1, t2.Col2, t2.Col3 }, 
        (t1, t2) => new { t1, t2 }) 
       .Where(o => o.t2.Col1 == col1 
        && o.t2.Col2 == col2 
        && o.t2.Col4 == someString) 
       .Select(o => o.t1); 

Wie Sie sehen können, erzeugt die Abfragesyntax im Falle von Joins normalerweise eine leichter zu lesende Anweisung.

+0

Legende - danke Justin. Ich denke, wenn ich noch drei Stunden weitergemacht hätte, hätte mich Trial and Error hierher gebracht !! Danke vielmals. –

+0

Ist es möglich, dies in Methodenstruktur (fließende Schnittstellen) zu tun? –

+1

@Maxim Zaslavsky - Meinst du Lambda Syntax verwenden? –

7

Sie können die WHERE-Klausel auch in der Lamda-Syntax in den Verweis auf die Tabelle aufnehmen, der Sie beitreten.

 var query = from pt in dc.ProjectTasks 
        join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId 
        join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO 
        select pt; 

Scheint jetzt offensichtlich, nicht wahr? Ich habe lange gebraucht, um diese Lösung zu finden.