Может быть попробовать что-то вроде:
public IQueryable<User> GetByRoleId(Role role) {
return db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => ur.User);
}
Где UsersRoleJoinTable - это таблица соединений «многие ко многим».
Надеюсь, это поможет.
Обновление : метод select (ur => ur.User) сообщает linq, что для каждой строки, возвращаемой функцией "db.UsersRoleJoinTable.Where (ur => ur.Role == role)", мы хотим чтобы получить пользователя, связанного с объектом UsersRoleJoinTable. Если вам нужен список идентификаторов пользователей, вы можете указать linq, чтобы он выбирал только user.id, выполнив команду select (ur => ur.id). Думайте о выборе linq как о некоем «для каждой строки сделайте это и поместите его в список, возвращенный вместо исходной строки»
У этого подхода есть один недостаток: я считаю, что в этом случае Linq генерирует sql для получения строк из таблицы Join (UsersRoleJoinTable), а затем для каждой возвращаемой строки выполняет другой запрос для поиска пользователя. Я могу ошибаться, поэтому для проверки SQL, сгенерированного Linq, выполните:
string sql_query = db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => u.User).ToString();
, а затем выведите значение sql_query или просмотрите его в режиме отладки. Если Linq фактически выполняет несколько запросов, то я думаю, что лучшее решение - создать представление или хранимую процедуру в SQL Server, чтобы связать пользователей с ролью, а затем добавить представление или хранимую процедуру в конструктор Visual Studio, чтобы вы могли называть вид как:
db.GetUsers(role_id) //if using a GetUsers stored procedure
или
db.UsersByRoleView.where(ur => ur.role_id == passed_role_id) //if using a UsersByRoleView view