Помогите с LinqtoSql - PullRequest
       3

Помогите с LinqtoSql

0 голосов
/ 03 февраля 2010

Я использую шаблон Repository, и я хочу написать метод, который получает роль и возвращает Iqueryable пользователей, принадлежащих к этой роли. (Я не уверен, правильно ли было бы получить объект роли или role_id ... в любом случае, как я могу это сделать? Мне не нравится структура запроса, я предпочитаю структуру метода linq. пользователей и ролей много для многих с таблицей присоединения users_roles.

     private ClasesDataContext db = new ClasesDataContext();
        public IQueryable GetByRole(Role role)
        {
            return db.Users.Where();
        }

Ответы [ 2 ]

1 голос
/ 03 февраля 2010

Может быть попробовать что-то вроде:

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
1 голос
/ 03 февраля 2010

Если у вас есть экземпляр объекта Role,

public IQueryable<User> GetByRole(Role role) {
       return db.Users.Where(u => u.Role == role);
}

будет работать.

Если вы просто не знаете Id или какое-либо другое свойство роли, что-то вроде этогоможет быть лучше.

public IQueryable<User> GetByRoleId(int roleId) {
   return db.Users.Where(u => u.Role.Id == roleId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...