У меня довольно простая проблема с неочевидным решением. У меня есть реляционное отображение в моей базе данных между пользователями и ролями, и каждый пользователь может быть сопоставлен с одной или несколькими ролями. Таким образом, отображение выглядит так:
User <1: n> UserRole Role
В моих сгенерированных POCO EF4 каждый пользователь и роль имеют ICollection другого:
public class User
{
//Bunch of other properties/methods
public virtual ICollection<Role> Roles
}
public class Role
{
//Bunch of other properties/methods
public virtual ICollection<User> Users
}
Теперь я реализовал шаблоны IoC, UoW и репозитория, показанные в этой статье , которая использует ObjectSet для извлечения / сохранения данных через репозитории.
У меня вопрос, как мне это реализовать :
public bool UserIsInRole(int userId, int roleId)
Я пробовал следующее:
public bool UserIsInRole(int userId, int roleId)
{
Role role = _roleRepository.Single(r => r.Id == roleId);
return _userRepository.SingleOrDefault(u => u.Roles.Contains(role)) != null;
}
Но это не с:
Невозможно создать постоянное значение типа «Data.Models.Role». В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).
Кроме того, это не очень элегантная реализация, поскольку приходится дважды обращаться к базе данных.
Я искал что-то вроде этого:
return _userRepository.SingleOrDefault(u => u.Roles.Where(r => r.Id = roleId));
Но ICollection не поддерживает LINQ.
Как я могу это сделать, и в идеале, как я могу сделать это с одним выражением LINQ и одной поездкой в базу данных?
Или я совершенно не прав?
Заранее спасибо.
Решено:
Спасибо всем, кто написал. Все дали приемлемый ответ. Я принял тот, который был самым элегантным.