我正在将异步编程引入到现有代码库中,并且在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;
}
答案 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()