异步编程投影

时间:2018-10-14 13:28:41

标签: c# asp.net-mvc entity-framework

我正在将异步编程引入到现有代码库中,并且在GetStudents()的结果上调用Select()时遇到了一些麻烦-收到的错误消息如下:“ Task<List<ApplicationUser>>不包含选择”。我认为这将归因于语法错误,但是任何指导都将不胜感激-谢谢。

   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 :(得分:2)

如前所述,该错误来自尝试在Select上调用Task<T>,这是无效的。但是,问题远不止于此。该代码当前正在从数据库中获取整个表,只是从结果内存中中获取一些值。这浪费了数据库和应用程序服务器中的处理时间。
不仅如此,而且仅使用线程池线程来等待I / O操作是另一种浪费。

总体来说,代码应该是这样的。

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;
}

答案 1 :(得分:0)

_studentRepo.GetStudents()返回一个Task<List<...>>

错误告诉您,Task不是集合,并且没有Select()方法。

您可以使用await在任务中获取集合,但是您需要在Select() ed值上调用await(您的代码当前await s {{ 1}})。

您需要添加括号:

Select()