异步lambda,不能隐式转换Task.Task.List<;对象>;到列表<;对象>;

本文关键字:lt 对象 gt Task lambda 列表 不能 异步 List 转换 | 更新日期: 2023-09-27 18:28:25

我有以下类

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
    });

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

谢谢。

异步lambda,不能隐式转换Task.Task.List<;对象>;到列表<;对象>;

当前,您正在将项目序列投影到一组任务中,这些任务完成后可以提供视图模型。如果您想拥有这些视图的序列,则需要(异步)等待这些任务全部完成。您可以使用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
    }));