2010-08-23 30 views
15

Sono in difficoltà con una clausola join/where con una semplice istruzione di selezione sql.LINQ Join Where Clausola

Sto cercando di recuperare un elenco di informazioni sul prodotto da tb1 con la condizione where behind in tbl2, ma questo deve essere unito da tre colonne diverse.

in modo che lo SQL apparirebbe qualcosa sulla falsariga di:

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 è il principale dove la clausola con la stringa da passare come parametro; tutte le altre colonne sono all'interno dei contesti.

Come si implementano più join con una clausola where?

E spinge nella giusta direzione, molto apprezzato.

risposta

42

Per partecipare sul campo multiplo in LINQ, è necessario creare un nuovo tipo anonimo che contiene le colonne che si desidera confrontare e quindi utilizzare tale tipo anonimo nel 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; 

Ed ecco il Lambda equivalente sintassi:

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); 

Come si può vedere, nel caso di join, sintassi di query di solito produce un più facile da leggere dichiarazione.

+0

Legenda - grazie Justin. Penso che se avessi continuato a frugare per altre 3 ore, la prova e l'errore mi avrebbero portato qui !! Molte grazie. –

+0

È possibile farlo nella struttura del metodo (interfacce fluenti)? –

+1

@Maxim Zaslavsky - Intendi usare la sintassi Lambda? –

7

È inoltre possibile includere la clausola WHERE nella sintassi lamda nel riferimento alla tabella a cui si sta partecipando.

 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; 

Sembra ovvio ora, non è vero? Mi ci è voluto molto tempo per trovare questa soluzione.