2009-07-21 12 views
12

ORステートメントを使用してLINQでJOINを実行したいとします。私はLINQの句でその変換のトラブルを抱えているLINQ OR OR

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 

:ここ

は私が始めているSQLクエリです。

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

と、これは動作しますが、一種のハックと思われるようだが:

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; 

私は私が使用できると思う:これは私がでてるところです。より良い方法がありますか?

答えて

2

where句はブール条件を適用するので、 "||"行く道です。複数のwhere節を連鎖させることができますが、 "or"ではなく "and"演算を与えると信じています。

+1

私は間違いなく使いたいです||私はそれをJOINに入れることを望んでいました。私はまだSQLの出力が何であるかをテストするためにそれを実行していないが、私はそれが結合で1と等しいとwhere節で私のORステートメントをコンパイルしている。 – AndyMcKenna

15

私は私が私の状況のた​​めによく働いた後の溶液、見つけるまでにもこれで苦労:カバーの下に

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; 

を、あなたのソリューションは、おそらくこの1に非常に近い動作します。しかし、もしベンチマークすれば、もう少し速くなると思います。なぜなら、第2のデータセットのすべての項目で最初のデータセットのすべての項目をジョインするのではなく、どちらか(または両方)のデータセットが本当に大きい場合に災害になる可能性があるからです。

+0

OPのソリューションの2つのテーブルのすべての項目に実際に参加しますか?条件を満たしている人だけが参加する「どこに」影響しませんか? –