2009-11-30 4 views
1

У меня есть база данных с таблицей пользователя и роли. У каждого пользователя может быть множество ролей, поэтому есть «средняя» таблица с именем UserRoles, которая просто содержит RoleId и UserId.SQL Linq Многие для многих

Теперь мне нужно получить все роли, прикрепленные к пользователю.

public IEnumerable<Role> GetAllRoles(int UserId) 
    { 
     var query = from R in _db.Roles 
        where RolesTbl.UserRoles.UserId == UserId 
        select R; 
     return query; 
    } 

Теперь выше запрос не работает, «RolesTbl.UserRoles.UserId» Я не могу Referance его таким образом из-за многие ко многим.

У кого-нибудь есть предложение о том, как решить проблему?

ответ

1

Это делает это?

public IEnumerable<Role> GetAllRoles(int UserId) 
    { 
     var query = from ur IN UserRoles 
        where ur.UserId == UserId 
        select ur.Roles; 
     return query; 
    } 
+0

Fantasic, на самом деле просто. – LiamB

+0

Я немного смущен относительно того, как это работает. Разве тип ur.Roles не был бы некоторым набором ролей? Таким образом, не следует, чтобы тип 'query' стал некоторым' IEnumerable '? ИЛИ делает ли LINQ-TO-SQL какую-то магию здесь, которая отличается от Linq-To-Objects? – AnthonyWJones

+0

Результат будет (я думаю) IQueryable , который является типом IEnumerable. – Paddy

0

Вы должны правильно использовать соединение, в противном случае вы бы оставили с последовательностью последовательности ролей, которые, хотя вы могли бы обойти с помощью SelectMany, объединение является более целесообразным.

public IEnumerable<Role> GetAllRoles(int userID) 
{ 
    return _db.Roles.Join(_db.UserRoles.Where(ur => ur.UserID == userID), r => r.ID, ur => ur.RoleID, (r, ur) => r); 
} 

Или, если вы предпочитаете неплавный синтаксис:

public IEnumerable<Role> GetAllRoles(int userID) 
{ 
    return from r in _db.Roles 
      join ur in _db.UserRoles on r.ID == ur.RoleID 
      where ur.UserID == userID 
      select r; 
} 
Смежные вопросы