LINQ与OR连接

时间:2009-07-21 12:57:45

标签: c# linq-to-sql

我想使用OR语句与LINQ进行JOIN。

这是我开始的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)

这有效,但看起来似乎有点hacky。有没有更好的办法?

3 个答案:

答案 0 :(得分:16)

我也在努力解决这个问题,直到我找到了以下解决方案,这对我的情况很有用:

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)

where子句应用布尔条件,因此使用“||”是要走的路。你可以链接多个where子句但我相信它会给你一个“和”操作,而不是“或”。

答案 2 :(得分:1)

我认为你可以这样做:

from t1 in db.Table1
// inner join with OR condition
from t2 in db.Table2 where t1.col1 == t2.col1 || t1.col2 == t2.col2
// normal inner join
join t3 in db.Table3 on t1.col1 equals t3.col1
// inner join with complex condition
join t4 in db.Table4 on t2.col4 equals t4.col4 where t2.col5.Contains(t4.col5)
// left join with OR condition
from t5 in db.Table5.Where(x => x.col5 == t1.col5 || x.col6 == t1.col6).DefaultIfEmpty()
select new {
    x = 1 // select whatever you want here
}

底层 SQL 查询可能不会使用本机 sql 连接,但以上只是一种让您的代码看起来更漂亮和有条理的方法。