Entity Framework - запрос таблицы отношений «многие ко многим» - PullRequest
13 голосов
/ 08 сентября 2011

У меня есть отношение "многие ко многим", определенное примерно так:

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 выглядит так:

enter image description here

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

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

Ответы [ 2 ]

31 голосов
/ 08 сентября 2011

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

Помещая его в другуюнаоборот - свойство 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;
}
3 голосов
/ 08 сентября 2011

Может быть?

var results = from r in db.Roles
              where roleIds.Contains(r.Id)
              select r.Employees;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...