繁体   English   中英

异步编程投影

[英]Projection with asynchronous programming

我正在将异步编程引入我的现有代码库,并且在GetStudents()的结果上调用Select()时遇到一些麻烦-收到的错误消息如下:“ 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;
    }

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

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

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

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

您需要添加括号:

(await ...).Select(...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM