6

我有几张表我想一起加入:

  • 用户
  • 用户角色
  • 工作流角色
  • 角色
  • 工作流程

我想生成的等效 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 之类的技巧?

4

3 回答 3

9

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

这个可读性更好,我认为:

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();
于 2013-01-16T21:17:15.283 回答
1

所以事实证明,您选择的顺序会有所不同:

user.Select(x => x.Roles.SelectMany(y => y.Workflows)).FirstOrDefault()
于 2013-01-16T21:13:46.790 回答
0

没有机会对此进行测试,但它应该可以工作:

Users.Include(user => user.UserRoles).Include(user => user.UserRole.WorkflowRoles.Workflow) 

如果以上不正确,那么您是否可以发布您的班级结构?

于 2013-01-16T20:49:23.633 回答