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

C# 实体框架-查询多对多关系表,c#,asp.net,linq,entity-framework,C#,Asp.net,Linq,Entity Framework,我的多对多关系定义如下: Employees -------------- EmployeeID (PK) Roles -------------- RoleID (PK) EmployeeRoles -------------- EmployeeID (PK, FK) RoleID (PK, FK) 我正试图获得一份员工名单,给出一份名单或RoleIDs: private MyDBEntities _entities; public SqlEmployeesRepository(MyD

我的多对多关系定义如下:

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

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

EmployeeRoles
--------------
EmployeeID (PK, FK)
RoleID (PK, FK)
我正试图获得一份员工名单,给出一份名单或RoleIDs:

private MyDBEntities _entities;

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

public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
{
    // get employees
}
私有MyDBEntities\u实体;
公共SqlEmployeesRepository(MyDBEntities)
{            
_实体=实体;
}
公共IQueryable GetEmployeesErrorles(int[]roleIds)
{
//雇佣员工
}
但是如果我尝试执行
\u entities.EmployeeRoles
,就没有EmployeeRoles对象。我的edmx如下所示:

因此,它识别了两个表之间的关系,但没有为EmployeeRoles创建实体对象


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

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

反过来说,每个员工的
角色
属性只包含特定员工拥有的角色

给定一组要查找的角色
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 getEmployeesErrores(int[]roleIds)
{
var employees=\u entities.employees
.Where(x=>x.Roles.Any(r=>roleIds.Contains(r.RoleID)))
返回员工;
}
编辑:

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

public IQueryable getEmployeesErrores(int[]roleIds)
{
var employees=\u entities.Roles
其中(r=>roleIds.Contains(r.RoleID))
.SelectMany(x=>x.Employees)
.Distinct()
返回员工;
}
也许吧

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

哈哈,我只是想把它作为您第一个解决方案的替代方案(使用
Distinct
等),但现在它已经不是替代方案了。你能把你的第一个解决方案作为你答案中的另一个选项吗。这是一种有趣的方法,还是有什么问题?@Slauma:是的,这是一种替代方法——但在研究了问题之后,这似乎更为直截了当,所以我划出了第一种方法——让我再把它挖出来;-)
var results = from r in db.Roles
              where roleIds.Contains(r.Id)
              select r.Employees;