【问题标题】:How do you join two many to many tables in Entity Framework?如何在 Entity Framework 中连接两个多对多表?
【发布时间】:2013-01-17 05:17:15
【问题描述】:

我有几张表要加入:

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

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

【问题讨论】:

    标签: entity-framework many-to-many


    【解决方案1】:

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

    我认为这个可读性更好:

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

    【讨论】:

      【解决方案2】:

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

      user.Select(x => x.Roles.SelectMany(y => y.Workflows)).FirstOrDefault()
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多