我有以下课程
public PhoneModel
{
int PhoneID;
string PhoneType;
string PhoneNumber;
}
public ContactModel
{
int ContactID;
string FirstName;
string LastName;
List<PhoneModel> PhoneNumber;
}
我需要显示每个联系人的所有电话号码的联系人列表。
var contactList = await ContactBLL.GetContactList();
IEnumerable<ContactViewModel> contacts = contactList.ToList().ConvertAll(
async c => new ContactViewModel
{
phones = (await ContactBLL.GetContactPhones(c.ContactID)).ToList(),
firstName = c.FirstName,
lastName = c.LastName
});
我目前收到的编译错误是&#34;无法隐式转换类型&#39; System.Threading.Tasks.Task.List到IEnumerable ....&#34;但是,如果没有async
电话来获取电话列表,它将起作用(当然没有电话)。我可以将async
函数GetContactPhones()
更改为同步功能,它将按预期工作。我的问题是有一种方法可以使上面的代码与async
调用一起工作吗?
谢谢。
答案 0 :(得分:6)
目前,您正在将项目序列投影到一组任务中,这些任务在完成后可以提供您的视图模型。如果要获得这些视图的序列,则需要(异步)等待这些任务全部完成。您可以使用Task.WhenAll
执行此操作:
var contacts = await Task.WhenAll(contactList.Select(
async c => new ContactViewModel
{
phones = (await ContactBLL.GetContactPhones(c.ContactID)).ToList(),
firstName = c.FirstName,
lastName = c.LastName
}));