【问题标题】:How to join 3 tables in entity framework 6如何在实体框架6中加入3个表
【发布时间】:2014-01-13 09:12:43
【问题描述】:

我有以下疑问:

select distinct X.* from X
inner join Y on X.ID = Y.ID1
inner join Z on Y.ID= Z.ID2
where Z.param = 1

我在第二次加入时遇到问题,到目前为止提出了

entities.X
.Join(entities.Y, t1 => t1.ID, t2 => t2.ID1, (t1, t2) => new { X= t1, Y= t2 }).Select(x => x.X)

但是添加第二个连接让我告诉我匿名类型不包含 t2.ID 的定义

entities.X
.Join(entities.Y, t1 => t1.ID, t2 => t2.ID1, (t1, t2) => new { X= t1, Y= t2 })
.Join(entities.Z, t2 => t2.ID, t3 => t3.ID1, (t2, t3) => new { Y= t2, Z= t3 }).Select(x => x.X)

有什么想法吗?

【问题讨论】:

  • 感谢 thejaka 的工作。我仍在研究如何在 de Z.Param = 1 上实现 Where 子句

标签: sql-server entity-framework join


【解决方案1】:

在第二个 Join 子句中,项目类型是您刚刚在前一个(第一个)Join 子句中创建的匿名类型。其中字段被定义为 X 和 Y 而不是 t1 和 t2,所以这些是您应该使用的字段。

entities.X
.Join(entities.Y, t1 => t1.ID, t2 => t2.ID1, (t1, t2) => new { X = t1, Y = t2 })
.Join(entities.Z.Where(p => p.param == 1), t2 => t2.Y.ID, t3 => t3.ID2, (t, t3) => new { X = t.X, Z = t3 })
.Select(u => u.X)
.Distinct();

(已编辑以反映原始 SQL 查询,并添加了说明)

注意:也可以在末尾添加 Where 子句,但我使用当前形式,因为通常先过滤(即在加入之前等)更好。

【讨论】:

    【解决方案2】:

    如果您配置了导航属性 1-n,我建议您使用:

    entities.X
      .SelectMany(x => x.Ys,               // 1st join
        (x, y) => new { X = x, Y = y })    // 1st projection
      .SelectMany(b => b.Y.Zs,             // 2st join etc...
        (b, z) => new 
        {
          b.X,                             //listed separatelly to not dig in
          b.Y, 
          Z = z
        })
      .Select(b => b.X)
      .Distinct();
    

    对我来说更清晰,使用多个嵌套连接看起来更好。

    【讨论】:

      猜你喜欢
      • 2014-01-29
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多