2010-08-23 14 views
15

Estoy luchando con una cláusula join/where con lo que es una declaración de selección sql bastante simple.LINQ Join Where Clause

Estoy tratando de recuperar una lista de información del producto de tb1 con la condición where detrás situada en tbl2, pero esto debe estar unido por tres columnas diferentes.

por lo que el SQL se vería algo en la línea de:

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 es la principal cláusula where con la cadena que se pasa como parámetro; todas las otras columnas están dentro de los contextos.

¿Cómo se implementan múltiples uniones con una cláusula where?

Y empuja en la dirección correcta, muy apreciada.

Respuesta

42

Para unir el campo múltiple en LINQ, usted tiene que crear un nuevo tipo anónimo que contiene las columnas que desea comparar y luego utiliza ese tipo anónimo en la combinación:

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; 

Y aquí está el Lambda equivalente sintaxis:

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

Como se puede ver, en el caso de uniones, la sintaxis de consulta por lo general produce un más fácil de leer la declaración.

+0

Leyenda - gracias Justin. ¡¡Creo que si hubiera seguido raspando por otras 3 horas, la prueba y el error me hubieran traído aquí !! Muchas gracias. –

+0

¿Es posible hacer esto en la estructura del método (interfaces fluidas)? –

+1

@Maxim Zaslavsky - ¿Quiere decir usar la sintaxis Lambda? –

7

También puede incluir la cláusula WHERE en la sintaxis de lamda en la referencia a la tabla en la que se está uniendo.

 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; 

Parece obvio ahora, ¿no? Me tomó mucho tiempo encontrar esa solución.