Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步lambda,无法隐式转换Task.Task.List<;对象>;列出<;对象>;_C#_Asynchronous_Lambda - Fatal编程技术网

C# 异步lambda,无法隐式转换Task.Task.List<;对象>;列出<;对象>;

C# 异步lambda,无法隐式转换Task.Task.List<;对象>;列出<;对象>;,c#,asynchronous,lambda,C#,Asynchronous,Lambda,我有以下课程 public PhoneModel { int PhoneID; string PhoneType; string PhoneNumber; } public ContactModel { int ContactID; string FirstName; string LastName; List<PhoneModel> PhoneNumber; } 公共电话模型 { int音素; 字符串音型; 字符串电话号码

我有以下课程

public PhoneModel
{
    int PhoneID;
    string PhoneType;
    string PhoneNumber;
}
public ContactModel 
{
    int ContactID;
    string FirstName;
    string LastName;
    List<PhoneModel> PhoneNumber;
}
公共电话模型
{
int音素;
字符串音型;
字符串电话号码;
}
公共接触模型
{
int ContactID;
字符串名;
字符串LastName;
列出电话号码;
}
我需要显示联系人列表,其中包含每个联系人的所有电话号码

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
    });
var contactList=wait contactbl.GetContactList();
IEnumerable contacts=contactList.ToList().ConvertAll(
async c=>新的ContactViewModel
{
phones=(wait contactbl.GetContactPhones(c.ContactID)).ToList(),
firstName=c.firstName,
lastName=c.lastName
});
我目前收到的编译错误是“无法隐式地将'System.Threading.Tasks.Task.List'类型转换为IEnumerable…”。但是,如果没有
async
调用来获取电话列表,它将工作(当然没有电话)。我可以将
async
函数
GetContactPhones()
更改为sync函数,它将按预期工作。我的问题是,有没有一种方法可以让上面的代码与
async
调用一起工作


谢谢。

目前,您正在将项目序列投影到一组任务中,这些任务完成后可以提供您的视图模型。如果希望拥有这些视图的序列,则需要(异步)等待这些任务全部完成。您可以使用
Task.whalll
执行此操作:

var contacts = await Task.WhenAll(contactList.Select(
    async c => new ContactViewModel
    {
        phones = (await ContactBLL.GetContactPhones(c.ContactID)).ToList(),
        firstName = c.FirstName, 
        lastName = c.LastName
    }));