2009-07-21 6 views
12

Je veux faire un JOIN avec LINQ en utilisant une instruction OR.LINQ joindre avec OU

Voici la requête SQL Je commence avec:

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 

Je ne parviens pas à convertir cette clause ON à LINQ. C'est là où je suis:

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; 

Je pense que je pourrais utiliser:

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

et cela fonctionne, mais semble semble un peu hacky. Y a-t-il un meilleur moyen?

Répondre

2

La clause where applique une condition booléenne, donc en utilisant "||" est le chemin à parcourir. Vous pouvez enchaîner plusieurs clauses where mais je crois que cela vous donnera une opération "et" plutôt qu'un "ou".

+1

Je veux absolument utiliser || mais j'espérais pouvoir le mettre au JOIN. Je ne l'ai pas encore exécuté pour tester ce que la sortie sql est mais je l'ai compilant avec 1 égal à 1 dans la jointure et mon instruction OR dans la clause where. – AndyMcKenna

15

Je mal à comprendre ce aussi bien jusqu'à ce que je trouve la solution suivante, ce qui a bien fonctionné pour ma situation:

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; 

Sous les couvertures, votre solution fonctionne probablement très proche de celui-ci. Cependant, je parie que celui-ci est un peu plus rapide si vous le comparez à tous les éléments du premier ensemble de données avec chaque élément du deuxième ensemble de données, ce qui pourrait être un désastre si l'un ou l'autre ensemble de données était vraiment grand.

+0

Va-t-il vraiment rejoindre CHAQUE élément des deux tables dans la solution de l'OP? Est-ce que le 'où' n'affectera pas que seuls ceux qui rencontrent la condition rejoindront ...? –