Проекция с асинхронным программированием - PullRequest
0 голосов
/ 14 октября 2018

Я внедряю асинхронное программирование в существующую кодовую базу и испытываю некоторые затруднения с вызовом Select () для результата GetStudents () - получено следующее сообщение об ошибке: "Task<List<ApplicationUser>> не содержит определения для Select",Я думаю, что это будет из-за неправильного синтаксиса, но любые указания будут оценены - спасибо.

   public async Task<List<ApplicationUser>> GetStudents()
    {
        return await Task.Run(() => _context.Users.ToList());
    }


    public async Task<StudentIndexViewModel> CreateStudentRegisterViewModel()
    {
        var model = new StudentIndexViewModel();
        var students = await _studentRepo.GetStudents().
            Select(x => new StudentViewModel
            {
                Forename = x.Forename,
                Surname = x.Surname
            }).ToListAsync();

        model.Students = students;

        return model;
    }

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Как уже упоминалось, ошибка возникает при попытке вызвать Select на Task<T>, что недопустимо.Тем не менее, проблема гораздо больше, чем это.В настоящее время код получает всю таблицу из базы данных, чтобы получить несколько значений из результата в памяти .Это бесполезная трата времени на обработку как в базе данных, так и на сервере приложений.
Не только это, но и использование потока пула потоков для ожидания операции ввода-вывода - это еще одна трата.

В целом код должен выглядеть примерно так.

public async Task<List<ApplicationUser>> GetApplicationUsersAsync()
{
    // use Entity Framework properly with ToListAsync
    // this returns the entire table
    return await _context.Users.ToListAsync();
}

public async Task<List<StudentViewModel>> GetStudentsAsync()
{
    // use Entity Framework properly with ToListAsync
    return await _context.Users
        // this only returns the 2 needed properties
        .Select(x => new StudentViewModel
        {
            Forename = x.Forename,
            Surname = x.Surname
        })
        .ToListAsync();
}


public async Task<StudentIndexViewModel> CreateStudentRegisterViewModel()
{
    var model = new StudentIndexViewModel();
    model.Students = await _studentRepo.GetStudentsAsync();

    return model;
}
0 голосов
/ 14 октября 2018

_studentRepo.GetStudents() возвращает Task<List<...>>.

Как показывает ошибка, Task не является коллекцией и не имеет Select() метода.

Вы можете использовать await, чтобы получить коллекцию внутри задачи, но вам нужно вызвать Select() для значения await ed (ваш код await s Select()).

Вам нужнодобавить скобки:

(await ...).Select(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...