Entity framework 如何在实体框架中连接两个多对多表?
我有几个表要连接在一起:Entity framework 如何在实体框架中连接两个多对多表?,entity-framework,many-to-many,Entity Framework,Many To Many,我有几个表要连接在一起: 使用者 用户角色 工作流角色 角色 工作流程 我要生成的等效sql类似于 select * from Users u inner join UserRoles ur on u.UserId = ur.UserId inner join WorkflowRoles wr on wr.RoleId = ur.RoleId inner join Workflow w on wr.WorkflowId = w.Id where u.Id = x 我希望根据用户在一个查询中
- 使用者
- 用户角色
- 工作流角色
- 角色
- 工作流程
select * from Users u
inner join UserRoles ur on u.UserId = ur.UserId
inner join WorkflowRoles wr on wr.RoleId = ur.RoleId
inner join Workflow w on wr.WorkflowId = w.Id
where u.Id = x
我希望根据用户在一个查询中的角色获取其所属的所有工作流。我发现你可以得到这样的结果:
user.Roles.SelectMany(r => r.Workflows)
但这会为每个角色生成一个查询,这显然不太理想
有没有一种合适的方法可以做到这一点,而不必求助于生成视图或编写直接sql之类的黑客?没有机会测试这一点,但它应该可以工作:
Users.Include(user => user.UserRoles).Include(user => user.UserRole.WorkflowRoles.Workflow)
如果以上不正确,那么您是否可以发布您的类结构?因此,您选择的顺序会产生差异:
user.Select(x => x.Roles.SelectMany(y => y.Workflows)).FirstOrDefault()
您可以尝试以下两个查询: 这本书可读性更好,我认为:
var workflows = context.Users
.Where(u => u.UserId == givenUserId)
.SelectMany(u => u.Roles.SelectMany(r => r.Workflows))
.Distinct()
.ToList();
(Distinct
,因为用户可以有两个角色,并且这些角色可能包含相同的工作流。如果没有Distinct
,将返回重复的工作流。)
但我相信,这一款表现更好:
var workflows = context.WorkFlows
.Where(w => w.Roles.Any(r => r.Users.Any(u => u.UserId == givenUserId)))
.ToList();