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()
感觉就像一个小调整。 就是做不好。 谁能帮我?谢谢。
感觉就像一个小调整
嗯,不完全是。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();
}