Невозможно вернуть запрашиваемые данные API в ASP. NET из хранилища. - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь вернуть JSON данные из API. Конечной точкой API является «/ api / getUserSchedule (int id)». Он должен вернуть обратно JSON данные, в которых он был отфильтрован согласно значению staffId, являющемуся внешним ключом таблицы taskSchedule.

Я могу вернуть все данные, как показано здесь, с использованием другой конечной точки API all API data

Однако мне нужно вернуть данные на основе staffID. Я создал интерфейс, который реализован в хранилище.

код интерфейса

public interface ITaskScheduleRepository
{    
  Task<TaskSchedule> GetUserSchedule(int id);  
}

Код репозитория

        public async Task<TaskSchedule> GetUserSchedule(int id)
    {
        var userTaskSchedule = await _context.TaskSchedules
        .Where(s => s.staffId == id)
        .ToListAsync();                                    

         return userTaskSchedule; // error is here            
    }

код контроллера

        [HttpGet("{id}")]
    public async Task<IActionResult> GetUserTaskSchedule(int id)
    {
        var taskUserSchedule = await _repo.GetUserSchedule(id);

        if(taskUserSchedule != null)
            return Ok(taskUserSchedule);            

        return BadRequest("There are no tasks for this user");     
    }

сообщение об ошибке

Не удается неявно преобразовать тип 'System.Collections.Generi c .List' в 'Schedular.API.Models.TaskSchedule' [Schedular.API] csharp (CS0029)

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Вы хотите 1 TaskSchedule экземпляр, а не их список, который будет возвращать ToListAsync.

Изменить

public async Task<TaskSchedule> GetUserSchedule(int id)
{
    var userTaskSchedule = await _context.TaskSchedules
        .Where(s => s.staffId == id)
        .ToListAsync();                                    

    return userTaskSchedule;
}

На этот

public Task<TaskSchedule> GetUserSchedule(int id)
{
    return _context.TaskSchedules.SingleOrDefaultAsync(s => s.staffId == id);
}

Обратите внимание, что я удалил async/await, потому что здесь это не нужно. Вы можете вернуть экземпляр Task<T> напрямую, чтобы его ожидал вызывающий. Если вам нужно что-то сделать с возвращенным экземпляром до того, как он будет возвращен в этом методе, тогда вы можете добавить обратно async/await и изменить экземпляр до того, как он будет возвращен.

Также считается хорошей практикой добавлять слово Async к имени ваших методов в качестве суффикса , если Возвращается задание / Task. Пример: GetUserScheduleAsync вместо GetUserSchedule.


Также вы можете также использовать FirstAsync, FirstOrDefaultAsync или SingleAsync вместо SingleAsync. Какой из них зависит от ваших требований в коде.

1 голос
/ 27 марта 2020

Вы пытаетесь вернуть List<TaskSchedule> (обратите внимание на ваш вызов .ToListAsyn c ()) в вашем методе репозитория), но ваш интерфейс определен для возврата одного TaskSchedule. Обновите интерфейс и методы репозитория, чтобы получить List<TaskSchedule>

Task<IList<TaskSchedule>> GetUserSchedule(int id);

и

public async Task<IList<TaskSchedule>> GetUserSchedule(int id)

Однако, если персонал может только иметь одно расписание, измените запрос к хранилищу, чтобы он возвращал один элемент вместо списка элементов.

var userTaskSchedule = await _context.TaskSchedules
    .Where(s => s.staffId == id)
    .FirstOrDefaultAsync();                                    

     return userTaskSchedule; /
...