Linq: несколько вложенных соединений или подзапросов - PullRequest
2 голосов
/ 07 ноября 2010

Я почти уверен, что могу получить желаемые результаты из одного оператора 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 в списке 'Roles' / IEnumerable, просто список RoleName (ов) для каждого UserId.

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

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

Не могли бы вы, пожалуйстапомогите мне или направьте меня в правильном направлении о том, как получить те же результаты из одного оператора Linq?

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

РЕДАКТИРОВАТЬ

Хорошо, я думаю, что добираюсь до этого:

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 Ответ

1 голос
/ 07 ноября 2010

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

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(),
            };

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...