2009-07-21 15 views
12

Chcę zrobić JOIN z LINQ za pomocą instrukcji LUB.LINQ dołącz z OR

Oto zapytań SQL Zaczynam:

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 

Mam problem konwersji, że w klauzuli LINQ. To jest, gdy jestem na:

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; 

Myślę, że mógłbym użyć:

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

i to działa, ale wydaje się niby wydaje hacky. Czy istnieje lepszy sposób?

Odpowiedz

2

Klauzula where odnosi się do warunku boolowskiego, więc używając "||" jest drogą do zrobienia. Możesz powiązać wiele klauzul, ale uważam, że da ci to operację "i", a nie "lub".

+1

Zdecydowanie chcę użyć || ale miałem nadzieję, że mogę to umieścić w JOIN. Jeszcze go nie uruchomiłem, aby przetestować to, co jest wyjściowe sql, ale mam to kompilowanie z 1 równa się 1 w złączeniu i moim OR w dół w klauzuli where. – AndyMcKenna

15

Walczyłem z tym, a także aż znalazłem następujące rozwiązanie, które działa dobrze dla mojej sytuacji:

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; 

pod kołdrą, rozwiązanie prawdopodobnie działa bardzo blisko tego. Założę się jednak, że ten jest tylko trochę szybszy, jeśli porównasz go, ponieważ nie ŁĄCZY każdy element w pierwszym zestawie danych z każdym elementem w drugim zbiorze danych, co może być katastrofą, jeśli jeden z tych zestawów byłby naprawdę duży.

+0

Czy naprawdę przyłączy się do KAŻDEGO elementu z dwóch tabel w rozwiązaniu OP? Czy nie wpłynie to na "miejsce", do którego dołączą tylko ci, którzy spełnią warunek? –