如何在Entity Framework中加入两个多对多的表?

DSh*_*ook 5 many-to-many entity-framework

我有一些我想加入的桌子:

  • 用户
  • 的UserRole
  • WorkflowRoles
  • 角色
  • 工作流程

我想要生成的等效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
Run Code Online (Sandbox Code Playgroud)

我希望根据用户在一个查询中的角色来获取用户所属的所有工作流.我发现你可以得到这样的结果:

user.Roles.SelectMany(r => r.Workflows)
Run Code Online (Sandbox Code Playgroud)

但这会为每个角色生成一个明显不太理想的查询.

是否有一个正确的方法来做到这一点,而不必诉诸于生成视图或编写直接sql的黑客?

Sla*_*uma 7

您可以尝试以下两个查询:

我认为这个更易读;

var workflows = context.Users
    .Where(u => u.UserId == givenUserId)
    .SelectMany(u => u.Roles.SelectMany(r => r.Workflows))
    .Distinct()
    .ToList();
Run Code Online (Sandbox Code Playgroud)

(Distinct因为用户可以有两个角色,这些角色可能包含相同的工作流程.Distinct不会返回重复的工作流程.)

但是我认为这个表现更好

var workflows = context.WorkFlows
    .Where(w => w.Roles.Any(r => r.Users.Any(u => u.UserId == givenUserId)))
    .ToList();
Run Code Online (Sandbox Code Playgroud)