Ответ 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;
}