Взаимосвязь между таблицами 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;
}