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 我希望根据用户在一个查询中

我有几个表要连接在一起:

  • 使用者
  • 用户角色
  • 工作流角色
  • 角色
  • 工作流程
我要生成的等效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
我希望根据用户在一个查询中的角色获取其所属的所有工作流。我发现你可以得到这样的结果:

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();