LINQ To Entity - отношения между многими и многими - VB.NET - PullRequest
1 голос
/ 02 марта 2012

У меня есть следующие таблицы в SQL:

Пользователи (UserID, Email) Роли (RoleID, RoleName) UsersInRoles (UserID, RoleID)

Я хочу вернуть список всехРоли и поле, в котором указано, была ли эта роль назначена конкретному пользователю.

В SQL я бы сделал это, используя следующий запрос:

SELECT R.RoleID, RoleName, CASE WHEN ISNULL(UIR.UserID, 0) = 0 THEN 0 ELSE 1 END
FROM Roles R
LEFT JOIN UsersInRoles UIR ON R.RoleID = UIR.RoleID AND UserID = 2

Моя модель сущностей скрывает таблицу UsersInRolesи вместо этого создает свойство навигации в каждой из сущностей «Пользователи» и «Роли», чтобы связать их.

Я пытаюсь написать аналогичный запрос LINQ to Entity, но не смог.

Вы можете помочь?

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Вы можете использовать Enumerable.Select метод проект список ролей в анонимных типах , которые содержат интересующие вас поля:

Dim results = roles.Select(Function(r) New With _
    { _
        .Id = r.RoleId, _
        .Name = r.RoleName, _
        .IsAssigned = r.Users.Any(Function(u) u.UserId = 2) _
    }

Если вы хотите избежать подзапросов, вы можете выразить левое внешнее объединение в LINQ:

Dim results = From r In roles
              Group Join u In users On r.RoleId Equals u.RoleId
              Into assignedUsers = Group _
              From au In assignedUsers.DefaultIfEmpty()
              Select New With _
              { _
                  .Id = r.RoleId, _
                  .Name = r.RoleName, _
                  .IsAssigned = If(au Is Nothing, False, au.UserId = 2) _
              }
0 голосов
/ 02 марта 2012

То, что вы пытаетесь выполнить, - это внешнее объединение с LINQ.

Вы можете найти пример здесь:
http://www.hookedonlinq.com/OuterJoinSample.ashx

Вот как бы вы это сделали в вашем случае:

var query = from r in db.Roles
            from u in db.Users
            join uir in u.Roles on r.RoleID equals uir.RoleID into outer
            from o in outer.DefaultIfEmpty()
            where u.UserID == 2
            select new
            {
              RoleID = r.RoleID, 
              RoleName = r.RoleName,
              IsInRole = (o != null)
            }

ОБНОВЛЕНИЕ

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