2

Я уверен, что могу получить результаты, которые я хочу получить от одного заявления Linq, я просто не могу найти его сам! Это то, что я до сих пор:Linq: несколько подзадач или подзапросы

var query = from uir in Aspnet_UsersInRoles 
     join r in Aspnet_Roles 
     on uir.RoleId equals r.RoleId 
     select new 
     { 
      UserId = uir.UserId, 
      RoleName = r.RoleName 
     }; 

var query2 = from q in query 
     group q by q.UserId into roles 
     select new 
     { 
      UserId = roles.Key, 
      Roles = roles.Distinct() 
     }; 

var query3 = from u in Aspnet_Users 
     join q in query2 
     on u.UserId equals q.UserId 
     select new 
     { 
      UserId = u.UserId, 
      UserName = u.UserName, 
      Roles = q.Roles 
     }; 

Ожидаемые результаты: Expected Results

и даже не правильно: я не действительно нужно иметь UserId в списке/IEnumerable «ролей», просто список RoleName (ов) для каждого UserId.

Я использую таблицы sql-членов asp.net и в основном хочу получить список пользователей, включая их роли.

  • У каждого пользователя может быть несколько ролей.
  • Пользователи могут не иметь вообще никакой роли (и все равно должны отображаться на результатах)

Можете ли вы мне помочь или указать мне в правильном направлении, о том, как получить те же результаты от одного оператора Linq?

PS. Да, я новичок Linq и ветеран SQL, который может затушевать мои мысли.

EDIT

Хорошо, я думаю, что я получаю к нему:

var q = from u in Aspnet_Users 
    from up in UserProfiles.Where(_up => _up.UserId == u.UserId).DefaultIfEmpty() 
    from uir in Aspnet_UsersInRoles.Where(_uir => _uir.UserId == u.UserId).DefaultIfEmpty() 
    from r in Aspnet_Roles.Where(_r => _r.RoleId == uir.RoleId).DefaultIfEmpty() 
    group r.RoleName by new  { 
           u.UserId, 
           u.UserName, 
           up.FirstName, 
           up.LastName, 
           u.LastActivityDate 
           } into g 
    select new 
    { 
     userID = g.Key.UserId, 
     firstName = g.Key.FirstName, 
     lastName = g.Key.LastName, 
     userName = g.Key.UserName,   
     lastActivityDate = g.Key.LastActivityDate, 
     roles = g.Distinct() 
    }; 

Что вы думаете? (я добавил информацию из моей собственной таблицы UserProfiles, соотношение 1: 1 с Aspnet_Users)

ответ

1

Я считаю, что это эквивалентно.

var query = from userRole in Aspnet_UsersInRoles 
      join role in Aspnet_Roles on userRole.RoleId equals role.RoleId 
      group role.RoleName by userRole.UserId into roles 
      join user in Aspnet_Users on roles.Key equals user.UserId 
      select new 
      { 
       user.UserId, 
       user.UserName, 
       Roles = roles.Distinct(), 
      }; 

Посмотрите, если это сработает.

+0

Я получаю: «Имя« userRole »не находится в области видимости в левой части« равно ». Рассмотрим замену выражений по обе стороны от« equals ». – qbantek

+0

Если я поменяю выражения, которые получаю: «Имя« пользователь »не находится в области действия в левой части« равно ». Рассмотрим замену выражений по обе стороны от« равно ». – qbantek

+0

Ах да, моя ошибка, я пытался сохранить ее читабельным и изменить ситуацию вокруг, где я, вероятно, не должен был. Группировка взяла 'userRole' вне сферы действия. –