LINQ присоединиться к ИЛИ - PullRequest
12 голосов
/ 21 июля 2009

Я хочу выполнить JOIN с LINQ, используя оператор OR.

Вот SQL-запрос, с которого я начинаю:

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

У меня проблемы с преобразованием этого предложения ON в LINQ. Вот где я нахожусь:

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;

Я думаю, я мог бы использовать:

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

и это работает, но, кажется, кажется хакерским. Есть ли способ лучше?

Ответы [ 2 ]

16 голосов
/ 13 сентября 2012

Я тоже боролся с этим, пока не нашел следующее решение, которое хорошо подошло для моей ситуации:

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;

Под прикрытием ваше решение, вероятно, работает очень близко к этому. Тем не менее, держу пари, что этот будет немного быстрее, если вы сравните его, так как он не объединяет каждый элемент в первом наборе данных с каждым элементом во втором наборе данных, что может быть катастрофой, если один (или оба) набор данных действительно большой.

2 голосов
/ 21 июля 2009

Предложение where применяет логическое условие, поэтому с помощью «||» это путь Вы можете связать несколько предложений where, но я считаю, что это даст вам операцию «и», а не «или».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...