我具有以下功能:
public async Task<List<UserViewModel>> Get(string role, string nameText, int offset, int number) {
List<User> users = new List<User>();
if (role != "") {
new List<User>(await userManager.GetUsersForClaimAsync(new System.Security.Claims.Claim("role", role)));
}
List<Task<UserViewModel>> data = users
.Skip(offset)
.Take(number)
.Select(async (user) => {
return await identityUserToUserViewModel(user); ;
}).ToList();
return data;
}
调用
async Task<UserViewModel> identityUserToUserViewModel(User user) {
var principal = await userManager.GetClaimsAsync(user);
return new UserViewModel()
{
Email = user.Email,
PhoneNumber = user.PhoneNumber,
Location = locationRepository.GetForUser(user.Id),
Name = user.Name,
Role = principal.Where(Claim => Claim.Type == "role").ToList().FirstOrDefault().Value,
sub = user.Id
};
}
但是,此函数给出的错误为
Cannot implicitly convert type 'System.Collections.Generic.List<System.Threading.Tasks.Task<Models.ViewModel.UserViewModel>>' to 'System.Collections.Generic.List<Models.ViewModel.UserViewModel>'
我知道异步lambda会将其转换回任务,但我不知道如何-不会发生这种情况。
答案 0 :(得分:1)
.Select(async (user) => {
return await identityUserToUserViewModel(user);
})
因为制作async
实际上意味着结果被包裹在Task
中,所以实际上具有与以下内容相同的结果:
.Select((user) => {
return identityUserToUserViewModel(user);
})
因此,该调用的结果为IEnumerable<Task<UserViewModel>>
。因此,将其转换为列表将为您提供任务列表,而不是UserViewModels列表。
如果您现在想等待 all 所有这些任务并只返回视图模型列表,则可以使用Task.WhenAll
。它将等待传递的所有任务,并幸运地返回所有任务结果的数组:
IEnumerable<Task<UserViewModel>> dataTasks = users
.Skip(offset)
.Take(number)
.Select(identityUserToUserViewModel);
UserViewModel[] data = Task.WhenAll(dataTasks);
return data;
答案 1 :(得分:0)
由于以下代码,每次通话都会返回Task<UserViewModel>
.Select(async (user) => {
return await identityUserToUserViewModel(user);
您可以用await Task.WhenAll(...)
包装LINQ表达式,这将返回一个UserViewModel
数组,该数组可以转换为List<UserViewModel>