Как преобразовать оператор SQL в LINQ «В» Join

#c# #entity-framework #linq

#c# #entity-framework #linq

Вопрос:

У меня есть этот оператор SQL:

 Select Id from dbo.AspNetUsers users Join AspNetUserRoles roles On roles.RoleId in ('2', '4', '5')
  

который я хотел бы преобразовать в Linq.

Самое близкое, что я мог к этому подойти, было:

 from users in db.AspNetUsers
join roles in db.AspNetUserRoles on new { RoleId = "2" } equals new { RoleId = roles.RoleId }
select new users.Id
  

который только присоединяется RoleId = "2" , но мне нужно, чтобы он также присоединился RoleId = "4" and "5" . По-видимому, ключевое слово «in» не поддерживается в инструкции join в LINQ.

Есть ли способ добиться эквивалентного поведения в LINQ, возможно, используя другой синтаксис функции?

Ответ №1:

Вместо того, чтобы использовать СОЕДИНЕНИЕ, используйте WHERE в свойстве навигации.

Я оставлю комментарии в строке, так как это должно быть проще для понимания.

 string[] roles = new[] { "2", "4", "5" };
var users = db.AspNetUsers
    // for each user
    .Where(user => user.Roles // get the roles
        // select the role id
        .Select(role => role.RoleId)
        // and filter by the wanted roles
        .Where(role => roles.Contains(role))
        // by ensuring any role with one of the wanted IDs exist
        .Any())
    // and then get the IDs of those users
    .Select(user => user.UserId)
    // to finally execute the query
    .ToList();