LINQ中多个左连接的正确语法?

cpp*_*rog 4 c# linq entity-framework join left-join

我试图找出LINQ多个左连接的语法,但我收到错误:The name 'c' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'.

我已经尝试过交换,如果我这样做,它会使'c'和'd'都有"not in scope"错误.

            var result = 
                    from a in db.tableA

                    join b in db.tableB //first join (inner join)
                        on a.field1 equals b.field1

                    join c in db.tableC //second join (left join)
                        on a.field1 equals c.field1
                            into left_one

                    join d in db.tableD   //third join (left join)
                        on c.field2 equals d.field2
                        // ^ here
                            into left_two


                    where a.field1 == theValueImSearchingFor


                    from c in left_one.DefaultIfEmpty()
                    from d in left_two.DefaultIfEmpty()

                    select new CombinedObject()
                    {
                        ...
                    }
Run Code Online (Sandbox Code Playgroud)

on c.field2 equals d.field2在第三个连接语句中使用的原因是我的表结构如下:

tableA:   field1
tableB:   field1
tableC:   field1    field2
tableD:             field2
Run Code Online (Sandbox Code Playgroud)

也就是说,将tableD与其余数据相关联的唯一方法是使用field2.

有人可以请更正我的语法吗?或者,根据我的表格设置,我是否有某种方法可以做到这一点?

Jan*_*e S 8

我使用这种语法:

var results = (from a in db.tableA
  from b in db.tableB.Where(s => s.field1 == a.field1)
  from c in db.tableC.Where(s => s.field1 == a.field1).DefaultIfEmpty()
  from d in db.tableD.Where(s => s.field2 == c.field2).DefaultIfEmpty()
  select new CombinedObject() { });
Run Code Online (Sandbox Code Playgroud)

它似乎在多个表上运行良好.我想我的field1s和field2s正确匹配你的例子:)

[编辑]

根据评论,如果你想添加一些额外的过滤,你只需将其添加到适当的地方Where().例如:

  from c in db.tableC.Where(s => s.field1 == a.field1 && s.field3 == someVariable).DefaultIfEmpty()
Run Code Online (Sandbox Code Playgroud)

这样的东西:)