Entity Framework - запрос таблицы взаимосвязей "многие ко многим"

У меня есть отношения "многие ко многим", определенные следующим образом:

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

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

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

Я пытаюсь получить список сотрудников, учитывая список или идентификаторы ролей:

private MyDBEntities _entities;

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

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

Но если я попытаюсь выполнить _entities.EmployeeRoles, то нет объекта EmployeeRoles. Мой edmx выглядит так:

enter image description here

Таким образом, он распознает взаимосвязь между двумя таблицами, но не создает объект сущности для EmployeeRoles.

Как я могу получить отдельный список сотрудников, получивших список идентификаторов роли?

Ответ 1

Связь между таблицами Role и Employee представляется как свойство навигации - каждое свойство Employees в объекте Role будет содержать только сотрудников, которые имеют эту конкретную роль.

Помещая это наоборот - каждое свойство Employee Roles содержит только роли, которые имеет конкретный сотрудник.

Учитывая набор ролей roleIds для поиска, вы можете использовать это, чтобы получить список сотрудников, которые имеют роль в этом наборе:

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

Edit:

Другой способ получить сотрудников - атаковать проблему с другой стороны отношений (начиная с роли, а не от сотрудника). Это, скорее всего, не так эффективно, как первый подход, так как мы должны дедуплицировать сотрудников (иначе сотрудники, т.е. Две роли будут отображаться дважды):

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

Ответ 2

Может быть,?

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