[英]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.