Как использовать объединение, чтобы сделать эти запросы чище? - PullRequest
1 голос
/ 23 октября 2010

У меня такое ощущение, что использование соединений может сделать это чище

public override string[] GetRolesForUser(string username)
{
   using (TemplateEntities ctx = new TemplateEntities())
   {
      using (TransactionScope tran = new TransactionScope())
      {
         int userId = (from u in ctx.Users
                       where u.UserName == username
                       select u.UserId).Single();
         int[] roleIds = (from ur in ctx.UserInRoles
                          where ur.UserId == userId
                          select ur.RoleId).ToArray();
         string[] roleNames = (from r in ctx.Roles
                               where roleIds.Contains(r.RoleId)
                               select r.RoleName).ToArray();
         tran.Complete();
         return roleNames;
      }
   }
}

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Вы должны иметь возможность использовать свойства навигации для отслеживания отношений вместо использования первичных ключей (Entity Framework присоединится к вам за кулисами)

Если у вас есть (и вам нужно) UserInRoles, потому чтоЕсть другие свойства, определенные в таблице соединений, которые вы можете использовать:

return (from u in cts.Users
        from ur in u.UserInRoles
        from r in ur.Roles
        select r.roleName).ToArray();

В противном случае убедитесь, что отношение NM сопоставлено как таковое, и не отображайте таблицу соединений.Тогда вы можете просто использовать:

return (from u in cts.Users
        from r in u.Roles
        select r.roleName).ToArray();
0 голосов
/ 23 октября 2010

Я не парень на C #, но по сути вы хотели бы сделать

select u.userId, ur.roleId, r.roleName 
from Users u, UserInRoles ur, Roles r 
where u.userId = ? and ur.userId = u.userId and r.roleId = ur.roleId; 

Вы также можете использовать синтаксис in, если вы выбираете вложенные запросы. т.е. где user_id в (выберите userId из UserInRoles)

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