Используйте метод Include для отображения определенных полей c в таблице jount - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над RestAPI и пытаюсь использовать метод Include (включить объединенную таблицу) в запросе Get от HobbyId, чтобы отображать определенные c поля из этой таблицы, а не все.

Таблицы: Пользователь, Хобби. Объединенная таблица: HobbyUsers, которым я хочу отображать только поля HobbyId и SkillsLevel из этой таблицы.

public async Task<User[]> GetUsersByHobby(int hobbyID)
{
    _logger.LogInformation($"Getting Users for hobby with ID:{hobbyID}");
    IQueryable<User> query =
                  _context.Users
                  .Include(a => a.HobbyUsers.Select(a => new
                      {
                          Id = a.HobbyId,
                          SkillLevel = a.SkillLevel
                      }))
                  .Where(h => h.HobbyUsers.Any(u => u.Hobby.HobbyId == hobbyID))
                  .OrderBy(u => u.HobbyUsers.First().SkillLevel);

    return await query.ToArrayAsync();
}

1 Ответ

0 голосов
/ 29 мая 2020

Вы не можете добавлять условия в метод Include в ef core , поэтому для фильтрации полей, отображаемых в результатах, вам нужно select the whole after the where condition.

Но поскольку вы хотите удалить некоторые поля в результате, то контент, возвращаемый запросом, не будет принят как тип User (был изменен на a custom type), вам нужно использовать var для получения.

Вот демо:

var query = _context.Users
              .Include(a => a.HobbyUsers)
              .Where(h => h.HobbyUsers.Any(u => u.Hobby.HobbyId == hobbyID))
              .Select(x => new 
              {
                  //here are Users class fields, you can change to what your class has.
                  Id = x.Id,
                  Name = x.Name,
                  HobbyUsers = x.HobbyUsers.Select(a => new 
                  {
                      Id = a.HobbyId,
                      SkillLevel = a.SkillLevel
                  })
              }).OrderBy(u => u.HobbyUsers.First().SkillLevel).ToList();
...