【问题标题】:linq join 3 tables with or conditionlinq 用 or 条件连接 3 个表
【发布时间】:2012-02-12 13:53:21
【问题描述】:

我需要在 LINQ 中创建一个包含 3 个表和 OR 条件的语句。

我的函数接收一个整数,我们称之为intZ。我有 3 张桌子:tableAtableBtableC

tableA 具有列 int1int2intBintBtableB 相关。

问题: tableA 中的int1int2 可以是intZ,并且必须与一个tableC 记录匹配。

我需要一个 OR 条件,但我不知道该放在哪里。它在where子句中吗?还是在equals子句中?

目前,我知道如何加入 3 个表,但条件让我很生气。

在 linq 中创建语句的两种方式有什么区别?对性能有影响吗?

edit:好的,现在我认为它更清楚了。 intZ 必须与来自tableCintC 相关联,这个数字可以是int1int2tableA

【问题讨论】:

  • 如果你写下你的 SQL 查询,它会更容易帮助你,这样我们就知道如何构建一个 linq 表达式。关于创建语句的 2 种方法,没有区别,只是您觉得哪种更舒服。
  • 我创建的查询是错误的,因为我没有使用 tableC,所以我没有放它。
  • “atm i 有多热”是什么意思?

标签: c# .net sql linq join


【解决方案1】:

只需将其添加到Where。在 Linq2Sql 中,这将被转换为 tableB 上的内部连接(带或)

from a in tableA
from b in tableB.Where(x => x.A == a.A || x.B == a.B)
select new { a, b };

【讨论】:

  • 我从未在 linq 上使用过这种类型的查询语句。 x是什么?我以前看过这个,但我不知道,所以我可以阅读更多关于它的信息。你能给我一个链接或名字吗?谢谢
  • x 是 tableB 中的一行(但仅在 where 子句中)我用它与 A OR B 列上的表 a 连接
  • 请告诉我这类查询的名称?它的结构与我正在使用的结构不同。谢谢
【解决方案2】:

您不能在 LINQ 的连接中使用“或”条件,因为它只支持等值连接。但是您应该可以在where 子句中毫无问题地做到这一点。例如:

var query = from rowC in tableC
            where rowC.intC == intZ
            from rowA in tableA
            where rowA.int1 == rowC.intC || rowA.int2 == rowC.intC
            join rowB in tableB on rowA.intB equals rowB.intB
            select new { rowA, rowB, rowC };

【讨论】:

  • tableC 我想是第三次加入,我必须匹配 intz == tableC.id 或 rowA.int1 == tableC.id 或 rowa.int2 == tableC.id。您应该如何将 tableC.id 放入其中?
  • @GuillermoVarini:抱歉,这一切如何结合在一起仍然很清楚。如果你能给出一个完整的例子会更清楚,最好是比int2等更有意义的名字。
  • 好的,它现在有一张图片并检查它说编辑的位置:我认为现在更清楚了。
  • @GuillermoVarini:好的,现在看看。看起来应该没问题。
【解决方案3】:

这可能会有所帮助。

var locations = from r1 in 
          (from a in context.A
          join b in context.B
          on a.ID equals b.ID
          select new
          {
            a.Prop1,
            a.Prop2,
            b.Prop3,
            b.ID
          })
          join c in context.C
          on r1.ID equals c.ID
          select new
          {
            r1.Prop1,
            r2.Prop2,
            r2.Prop3,
            c.Prop4
          };

【讨论】:

    【解决方案4】:

    在我的一生中,我无法在查询中获得 .Where to work(也许这就是我使用 LinqPad 的方式),但我能够让以下内容正常工作:

    from s in Stores
    join a in Areas on s.AreaID equals a.ROWID
    join r in Regions on a.RegionID equals r.ROWID
    join e in Employees on 1 equals 1     // <-- produces a cartesian product
    join t in Titles on e.TitleID equals t.ROWID
    where e.AreaID == a.ROWID || e.RegionID == r.ROWID // <--filters the data based on OR stmt
    where s.StoreNum == 469
    select new { r.RegionName, a.AreaName, s.StoreNum, s.StoreName, t.JobCode, e.FirstName, e.LastName }
    

    【讨论】:

      【解决方案5】:

      试试这个:-

      var result= tableA.SelectMany(a => tableB.Where(x => x.A == a.A || x.B == a.B), (a, b) => new {a, b});
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多