异步lambda并不能隐式地将Task.Task.List <Object>转换为List <Object>

T L*_*T L 5 c# lambda asynchronous

我有以下课程

public PhoneModel
{
    int PhoneID;
    string PhoneType;
    string PhoneNumber;
}
public ContactModel 
{
    int ContactID;
    string FirstName;
    string LastName;
    List<PhoneModel> PhoneNumber;
}
Run Code Online (Sandbox Code Playgroud)

我需要显示每个联系人的所有电话号码的联系人列表.

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
    });
Run Code Online (Sandbox Code Playgroud)

我目前得到编译错误说"不能隐式转换类型'System.Threading.Tasks.Task.List到IEnumerable ...."然而,没有async电话获取电话列表,它将工作(当然没有电话).我可以将async功能更改GetContactPhones()为同步功能,它将按预期工作.我的问题是有一种方法可以使上面的代码与async调用一起工作吗?

谢谢.

Ser*_*rvy 8

目前,您正在将项目序列投影到一组任务中,这些任务在完成后可以提供您的视图模型.如果要获得这些视图的序列,则需要(异步)等待这些任务全部完成.你可以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
    }));
Run Code Online (Sandbox Code Playgroud)