#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();