【问题标题】:LINQ join with ORLINQ 加入 OR
【发布时间】:2021-03-03 14:29:20
【问题描述】:

我想使用 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。有没有更好的办法?

【问题讨论】:

  • 当然,两次加入团队更有意义,一次用于主场,一次用于客场,否则您已经获取了相关的数据,即hometeam-game-awayteam,并将其分离为两行(即game-hometeamgame-awayteam)..然后你必须开始搞乱运行一个分组来尝试重新组合在一起..

标签: c# linq-to-sql


【解决方案1】:

我也为此苦苦挣扎,直到找到以下解决方案,该解决方案非常适合我的情况:

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;

在幕后,您的解决方案可能非常接近这个解决方案。但是,我敢打赌,如果你对它进行基准测试,它会快一点,因为它不会将第一个数据集中的每个项目与第二个数据集中的每个项目连接起来,如果其中一个(或两个)数据集真的很大,这可能是一场灾难。

【讨论】:

  • 它真的会加入 OP 解决方案中两个表的每一项吗?只有符合条件的人才会加入,“哪里”不会影响...?
【解决方案2】:

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

【讨论】:

  • 我绝对想用 ||但我希望我可以把它放在 JOIN 中。我还没有执行它来测试 sql 输出是什么,但是我让它在 join 中使用 1 等于 1 并在 where 子句中使用我的 OR 语句进行编译。
【解决方案3】:

我认为你可以这样做:

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 连接,但以上只是让您的代码看起来漂亮和有条理的一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2020-12-07
    • 2019-01-15
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多