【问题标题】:Entity Framework - querying a many-to-many relationship table实体框架 - 查询多对多关系表
【发布时间】:2011-11-13 06:46:24
【问题描述】:

我有一个这样定义的多对多关系:

Employees
--------------
EmployeeID (PK)

Roles
--------------
RoleID (PK)

EmployeeRoles
--------------
EmployeeID (PK, FK)
RoleID (PK, FK)

我正在尝试获取员工列表,给定列表或 RoleID:

private MyDBEntities _entities;

public SqlEmployeesRepository(MyDBEntities entities)
{            
    _entities = entities;
}

public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
{
    // get employees
}

但如果我尝试执行_entities.EmployeeRoles,则没有 EmployeeRoles 对象。我的 edmx 看起来像这样:

所以它是在识别两个表之间的关系,但它不是为 EmployeeRoles 创建实体对象。

如何在给定角色 ID 列表的情况下获得不同的员工列表?

【问题讨论】:

    标签: c# asp.net linq entity-framework


    【解决方案1】:

    表 Role 和 Employee 之间的关系表示为导航属性 - Role 实体中的每个 Employees 属性将仅包含具有此特定角色的员工。

    反过来说——每个员工的Roles 属性只包含特定员工的角色。

    给定一组角色roleIds,您可以使用它来获取在该组中具有角色的员工列表:

    public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
    {
        var employees = _entities.Employees
                                 .Where( x=> x.Roles.Any(r => roleIds.Contains(r.RoleID)))
       return employees;
    }
    

    编辑:

    获得员工的另一种方法是从关系的另一方(从角色开始,而不是员工开始)解决问题。这很可能不如第一种方法有效,因为我们必须对员工进行重复数据删除(否则具有两个角色的员工会出现两次):

    public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
    {
        var employees = _entities.Roles
                                 .Where( r => roleIds.Contains(r.RoleID))
                                 .SelectMany( x=> x.Employees)
                                 .Distinct()
       return employees;
    }
    

    【讨论】:

    • 大声笑,我只是将其发布为您第一个解决方案的替代方案(使用Distinct 等),但现在它不再是替代方案了。您能否将您的第一个解决方案作为答案中的另一个选项。这是一种有趣的方式,还是有什么问题?
    • @Slauma:是的,它是一种替代方案——但在看到问题后这似乎更直接,所以我开始使用第一种方法——让我再次挖掘它;-)
    【解决方案2】:

    也许?

    var results = from r in db.Roles
                  where roleIds.Contains(r.Id)
                  select r.Employees;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      相关资源
      最近更新 更多