【问题标题】:How can I convert this left outer join SQL statement in to a LINQ query?如何将此左外连接 SQL 语句转换为 LINQ 查询?
【发布时间】:2016-12-13 16:44:46
【问题描述】:

这对我来说有点令人困惑。我知道左外连接本身并没有内置到 LINQ 中,您必须使用“into”和“DefaultIfEmpty()”,但我有一些复杂的 SQL 查询。

查询:

SELECT * FROM TableA as a
LEFT OUTER JOIN TableB as b
on a.ID = b.ID and a.StatusOne = 1 AND b.StatusOne = 1 AND (a.StatusTwo != 1 OR b.StatusTwo!= 1)
LEFT OUTER JOIN TableC as c
on a.ID = c.ID AND a.StatusOne = 1 AND c.StatusOne = 1 AND (a.StatusTwo != 1 OR c.StatusTwo != 1)
WHERE
a.ID = 99999 AND (b.ID is not null OR c.ID is not null)

我什至不确定从哪里开始。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

标签: c# sql-server linq join linq-to-sql


【解决方案1】:

我给你背后的想法,我没有测试代码,但是要根据不同的字段连接两个表,你的连接应该有一个匿名类型来比较。

var one = 1

from a in tableA
join b in tableB on new { a.ID, b.StatusOne } equals new { b.ID, one} into ab

但在你的情况下,你有多个条件,所以在调用 DefaultIsEmpty 之前,你应该检查最新的条件

from a in tableA
join b in tableB on new { a.ID, b.StatusOne } equals new { b.ID, one} into ab
from ab in ab.Where(x => x.a.StatusTwo != 1 || x.b.StatusTwo != one).DefaultIfEmpty()

然后另一个外连接遵循相同的模式,您需要进行最终连接。一个好的开始方法是下载 LinqPad 并查看它为您的查询生成的 lambda 表达式,您可以从那里获取它。您可以稍后对其进行优化,但您将了解这一代背后的想法。希望这会有所帮助

【讨论】:

  • 啊,非常感谢!你只是让它为我点击,我就能让它工作。并且对 LinqPad 进行了很好的调用(我承认我完全忘记了它),它极大地帮助了我进行调试。非常感谢!
  • @Daath 如果您也可以将最终代码作为答案的一部分发布,以便人们也可以看到它。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多