2011-03-12 2 views
1

Я пытаюсь получить все пользователи и их роли из сгенерированных таблиц членства и ролей, и я пришел с этим:Получение всех пользователей и их ролей (членство и роли) с помощью Linq2Sql, правильный запрос?

var query = from a in aspnet_Users 
      select new { a.UserName, a.UserId } into b 
      join c in aspnet_UsersInRoles on b.UserId equals c.UserId 
      join d in aspnet_Roles on c.RoleId equals d.RoleId 
      group d.RoleName by b; 

Является ли это хорошо или есть лучший способ сделать это?

ответ

0

Да, есть. Вы в основном перевели SQL-запрос в LINQ и забыли, что в LINQ вы можете перемещаться по свойствам (то есть user.Role), что приводит к автоматическим объединениям.

Было бы проще просто получить пользователей, указав Linq на SQL, чтобы привести роли пользователя (или другим способом: привести роли и включить связанных пользователей). Вот ссылка, чтобы посмотреть, как это сделать без ленивой загрузки: http://www.singingeels.com/Blogs/Nullable/2008/10/27/EntityFramework_Include_Equivalent_in_LINQ_to_SQL.aspx.

Приветствия

+0

Привет, Да, я забыл об этом :-) Но я не могу перейти от пользователей к ролям за один раз, я заметил - от пользователей я могу только перейти к usersinrole. Спасибо за ссылку. Я думаю, что хочу сохранить ленивую загрузку, хотя ... – TheDude

3

Ну, используя прямой подход, запрашивая база данных будет работать. Тем не менее, вы полностью обходите членство и все функции, которые он предлагает.

Почему бы просто не использовать членство:

var roles = from MembershipUser u in Membership.GetAllUsers() 
      select new {user = u, 
      roles = Roles.GetRolesForUser(u.UserName)}; 

Таким образом, если в будущем структура базы данных изменяет ваш код будет работать, как вам не нужно знать реализацию.

Как вы думаете?

пс: Я не проверил, какого рода SQl генерируется, поэтому если вам нужна супер производительность он все еще может быть лучше идти прямо к БД

 Смежные вопросы

  • Нет связанных вопросов^_^