繁体   English   中英

实体框架 - 查询多对多关系表

[英]Entity Framework - querying a many-to-many relationship table

我有一个多对多的关系,定义如下:

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 列表,如何获得不同的员工列表?

表 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;
}

也许?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM