Вернуть всех пользователей с идентификатором роли в списке - PullRequest
0 голосов
/ 01 мая 2018

У меня есть 3 таблицы: User, Roles и UserRoles, и у меня есть список идентификаторов ролей { 2, 3, 4 }. Я хочу вернуть всех пользователей с идентификатором 2, 3 или 4.

Модель:

public partial class User
{
    public int Id { get; set; }
    public virtual ICollection<UserRoles> UserRoles { get; set; }
}

public partial class Roles
{
    public int Id { get; set; }
}

public partial class UserRoles
{
    public int UserId { get; set; }
    public int RoleId { get; set; }

    public virtual Users Users { get; set; }
    public virtual Roles Roles { get; set; }
}

И код у меня есть:

int[] RoleIds = { 2, 3, 4 };
return await _dbContext.Users
    .Where(u => u.UserRoles.Any(x=> RoleIds.Contains(x.RoleId)));

Не знаю почему, но мой результат содержит записи с roleId == 1.

обновление

Я знаю почему .. Мой код правильный. Что-то не так в классе Mapper. Я использовал что-то вроде .FirstOrDefault (). RoleId. поэтому он возвращает только первые данные, и пользователь может иметь несколько ролей! Спасибо, ребята

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Похоже, вы пытаетесь получить пользователя из таблицы отношений UserRole.

Вот как это сделать в синтаксисе выражения запроса:

int[] RoleIds = { 2, 3, 4 }; 

var users = from ur in _dbContext.UserRoles
            where RoleIds.Contains(ur.RoleId)
            select ur.Users;

Или, если вы не хотите или у вас есть навигационные свойства:

int[] RoleIds = { 2, 3, 4 }; 

var users = from ur in _dbContext.UserRoles
            where RoleIds.Contains(ur.RoleId)
            join user in _dbContext.Users
            on ur.UserId equals user.Id
            select user;
0 голосов
/ 02 мая 2018

Если вы не хотите добавлять навигационные свойства ни к User, ни к Roles, вы можете легко сделать это, используя синтаксис запроса LINQ:

var usersQuery = from role in _dbContext.Roles
                 join userRole in _dbContext.UserRoles 
                     on role.Id equals userRole.RoleId
                 join user in _dbContext.Users
                     on userRole.UserId equals user.Id;
                 where roleIds.Contains(role.Id)
                 select user;

var users = usersQuery.ToList();
0 голосов
/ 02 мая 2018

попробуйте вернуться назад и посмотреть, поможет ли это ...

return await _dbContext.UserRoles
     .Where(r => RoleIds.Contains(r.RoleId))
     .Select(r => r.Users)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...