2009-07-21 26 views
12

Quiero hacer un JOIN con LINQ usando una instrucción OR.LINQ join with OR

Ésta es la consulta SQL que estoy empezando con:

SELECT t.id 
FROM Teams t 
INNER JOIN Games g 
    ON (g.homeTeamId = t.id OR g.awayTeamId = t.id) 
    AND g.winningTeamId != 0 
    AND g.year = @year 
GROUP BY t.id 

Tengo problemas para la conversión de dicha cláusula ON a LINQ. Aquí es donde estoy en:

var y = from t in db.Teams 
     join g in db.Games on t.ID equals g.AwayTeamID //missing HomeTeamID join 
     where g.WinningTeamID != 0 
      && g.Year == year 
     group t by t.ID into grouping 
     select grouping; 

Creo que podría utilizar:

join g in db.Games on 1 equals 1 
where (t.ID == g.HomeTeamID || t.ID == g.AwayTeamID) 

y esto funciona, pero parece un poco parece hacky. ¿Hay una mejor manera?

Respuesta

2

La cláusula where aplica una condición booleana, por lo que usa "||" es el camino a seguir. Puede encadenar varias cláusulas where, pero creo que eso le dará una operación "y", en lugar de un "o".

+1

Definitivamente quiero usar || pero esperaba poder ponerlo en el JOIN. No lo he ejecutado aún para probar cuál es la salida sql, pero lo tengo compilando con el 1 igual a 1 en la unión y mi declaración OR hacia abajo en la cláusula where. – AndyMcKenna

15

tuve problemas con esto, así hasta que encontré la siguiente solución, que funcionaba bien para mi situación:

var y = from t in db.Teams 
     from g in db.Games 
     where 
     (
      t.ID == g.AwayTeamID 
      || t.ID == g.HomeTeamID 
     ) 
      && g.WinningTeamID != 0 
      && g.Year == year 
     group t by t.ID into grouping 
     select grouping; 

Debajo de las sábanas, su solución probablemente funciona muy cerca de éste. Sin embargo, apuesto a que este es un poco más rápido si lo comparas, ya que no se une cada elemento en el primer conjunto de datos con cada elemento en el segundo conjunto de datos, lo que podría ser un desastre si uno o ambos conjuntos de datos fueran realmente grandes.

+0

¿Realmente se unirá CADA elemento de las dos tablas en la solución de OP? ¿No le afectará el "dónde" que solo los que cumplan la condición se unirán ...? –