LINQ 查询外部联接父表和子表(嵌套)

本文关键字:嵌套 查询 外部 LINQ | 更新日期: 2023-09-27 18:33:20

我有三个级别的表"董事","经理"和"领导者",它们之间有一对多的关系。

我想把董事、经理和领导的所有行以及他们的子关系分开。(也许是 LeftOuterJoin(

例如,控制器表有

董事

ID董事姓名

     1            Director1 

经理

经理 ID 董事 ID 经理姓名

  1              1                 Manager 1
  2              1                 Manager 2

领导人

领导者 ID 经理 ID 领导者名称

  1                 1              Leader 1  
  2                 1              Leader 2

我希望查询返回

目录 控制器名称 MgrID 管理器名称 目录 领导者名称

1名

董事1
1 董事1 1 经理1
1 董事1 1 经理1 1 领导1
1 董事1 1 经理1 2 领导者1
1 董事1 2 经理2

我的 linq 查询只产生 3 行

的结果

目录 控制器名称 MgrID 管理器名称 目录 领导者名称

1 董事1 1 经理1 1

领导1
1 董事1 1 经理1 2 领导者1
1 董事1 2 经理2

             var query = from d in db.Directors
                        join m in db.Managers on d.DirectorID equals m.DirectorID into directorMgrGroup
                        from dmgr in directorMgrGroup.DefaultIfEmpty()
                        join l in db.Leaders on dmgr.ManagerID equals l.ManagerID into mgrLeaderGroup
                        from mlgr in mgrLeaderGroup.DefaultIfEmpty()

感觉就像一个小调整。 就是做不好。 谁能帮我?谢谢。

LINQ 查询外部联接父表和子表(嵌套)

感觉就像一个小调整

嗯,不完全是。SQL 中的结果格式由所谓的ROLLUP查询生成,LINQ 本身不支持该查询。GroupJoin 将收集所需的信息,但按照您想要的方式将其展平非常困难,如下所示(连接组加入组的单个项目数组的组合(。看看吧:

var query =
db.Directors.GroupJoin(db.Managers, director => director.DirectorId, manager => manager.DirectorId, (director, managerGroup) => new
{
    Id = director.DirectorID,
    Name = director.DirectorName,
    Managers = managerGroup.GroupJoin(db.Leaders, manager => manager.ManagerId, leader => leader.ManagerID, (manager, leaderGroup) => new
    {
        Id = manager.ManagerID,
        Name = manager.ManagerName,
        Leaders = leaderGroup.Select(leader => new
        {
            Id = leader.LeaderID,
            Name = leader.LeaderName
        })
    })
})
.SelectMany(director =>  
    new[] { new
    {
        DirID = director.Id, DirectorName = director.Name,
        MgrID = (int?)null, ManagerName = (string)null,
        LdrID = (int?)null, LeaderName = (string)null
    } }
    .Concat(director.Managers.SelectMany(manager => 
        new[] { new
        {
            DirID = director.Id, DirectorName = director.Name,
            MgrID = (int?)manager.Id, ManagerName = manager.Name,
            LdrID = (int?)null, LeaderName = (string)null
        } }
        .Concat(manager.Leaders.Select(leader => new
        {
            DirID = director.Id, DirectorName = director.Name,
            MgrID = (int?)manager.Id, ManagerName = manager.Name,
            LdrID = (int?)leader.Id, LeaderName = leader.Name
        }))
    ))
);

我建议您编写一个SQL查询,将其放入sql视图中并将其映射为EF实体。这样,您可以在数据库中执行此操作(它仍然是运行最快的(,并且仍然可以在 EF 中对其进行筛选。

外连接总是让 EF 感到痛苦

Create View ViewMyShiningAss
Begin
 /* select the outer join shit */
end

更新 EF 模型

using(var ctx = new MyModelEntities())
{
    var x = ctx.ViewMyShiningAss.ToList();
}