Получить роль пользователя в структуре сущностей с помощью запроса соединения в ядре asp.net - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть 4 таблицы: «Пользователи», «Роли», «Фотографии» и «Отношения пользователей».Таблицы Users & Roles - это таблицы идентификационных серверов. Я хочу знать, что я хочу вернуть список пользователей с именами их ролей. Я могу получить другие детали, но я застрял при получении имени Role.

вот скриншоты таблиц, созданных мной

Фотографии Нажмите здесь, чтобы посмотреть изображение

UserRelationships Нажмите здесь, чтобы посмотреть изображение

это код, который я пробовал

var relations = await (from relation in _context.UserRelationships
                                   where (relation.RelatingUserId == id || relation.RelatedUserId == id)
                                    && (relation.Status == UserRelationShipStatus.Active)
                                    && (relation.Type != UserRelationshipType.Blocked)

                                   select new
                                   {
                                       RelationId = relation.Id,
                                       User = relation.RelatedUserId == id ? (from usr in _context.Users
                                                                              join photo in _context.Photos on usr.Id equals photo.UserId
                                                                              where usr.Id == relation.RelatingUserId && photo.IsMain == true
                                                                              select new
                                                                              {
                                                                                  UserId = usr.Id,
                                                                                  UserName = usr.UserName,
                                                                                  PhotoUrl = photo.Url,
                                                                                  Role = ?
                                                                              })
                                                       : (from usr in _context.Users
                                                          join photo in _context.Photos on usr.Id equals photo.UserId
                                                          where usr.Id == relation.RelatedUserId && photo.IsMain == true
                                                          select new
                                                          {
                                                              UserId = usr.Id,
                                                              UserName = usr.UserName,
                                                              PhotoUrl = photo.Url,
                                                              Role = ?
                                                          })

                                   }
                                  ).ToListAsync();

То, что я делаю здесь, в моей таблице UserRelationships содержит два поля под названием RelatingUserId & RelatedUserId.It означает, что отношения отправляют пользователя и полученного пользователя.Если переданный UserId равен одному из этих полей, то я хочу получить данные этого пользователя. Я хочу знать, как при получении роли пользователя это сделать.

спасибо в продвинутом

1 Ответ

0 голосов
/ 26 декабря 2018

Не удалось получить данные в запросе Linq.Попробуйте вернуть результат с помощью ViewModel вместо анонимного типа.А затем добавьте роли к результату, получив роль пользователя.

1. Создайте ViewModel

public class UserRelationshipsViewModel
{
    public string RelationId { get; set; }
    public UserViewModel User { get; set; }

}

public class UserViewModel
{
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string PhotoUrl {get; set;}

    public IList<string> Roles { get; set; }
}

2.Введите данные с помощью ViewModel

var relations = await (from relation in _context.UserRelationships
                               ...
                               select new UserRelationshipsViewModel
                               {
                                   RelationId = relation.Id,
                                   User = relation.RelatedUserId == id ? (from usr in _context.Users
                                                                          join photo in _context.Photos on usr.Id equals photo.UserId
                                                                          where usr.Id == relation.RelatingUserId && photo.IsMain == true
                                                                          select new UserViewModel
                                                                          {
                                                                              UserId = usr.Id,
                                                                              UserName = usr.UserName,
                                                                              PhotoUrl = photo.Url,

                                                                          })
                                                   : (from usr in _context.Users
                                                      join photo in _context.Photos on usr.Id equals photo.UserId
                                                      where usr.Id == relation.RelatedUserId && photo.IsMain == true
                                                      select new UserViewModel
                                                      {
                                                          UserId = usr.Id,
                                                          UserName = usr.UserName,
                                                          PhotoUrl = photo.Url,

                                                      })

                               }
                              ).ToListAsync();

3.Добавьте ролик данным.

 foreach (var r in relations)
        {
            var user = await _userManager.FindByIdAsync(r.User.UserId);
            var Roles = await _userManager.GetRolesAsync(user);
            r.User.Roles = Roles;
        }

Обновление:

Это приведет к снижению производительности при наличии тысяч пользователей. Я пытался присоединиться к таблице UserRoles для получения ролей.

              (from usr in _context.Users

                    join ur in _context.UserRoles on usr.Id equals ur.UserId into bt
                    join photo in _context.Photos on usr.Id equals photo.UserId
                    where usr.Id == relation.RelatingUserId && photo.IsMain == true
                    select new
                    {

                        Roles = (from x in bt
                                join r in _context.Roles on x.RoleId equals r.Id
                                select new
                                {
                                    r.Name
                                }
                                ).ToList()

                    })
...