【问题标题】:foreach statement cannot operate on variables of type 'Task<<anonymous type:foreach 语句不能对 'Task<<anonymous 类型的变量进行操作:
【发布时间】:2019-02-22 21:30:39
【问题描述】:
var contacts = (from c in _db.Contacts
                join dgm in _db.DistributionGroupMembers on c.Id equals dgm.ContactId
                join dg in _db.DistributionGroups on dgm.DistributionGroupId equals dg.Id
                join dgis in _db.DistributionGroupInSms on dg.Id equals dgis.DistributionGroupId
                where dgis.SmsId == SmsId
                select new
                {
                    id = c.Id,
                    FirstName = c.FirstName,
                    LastName = c.LastName,
                    PhoneNumber = c.PhoneNumber,
                    Result = "Waiting to be sent"
                }).Distinct().ToArrayAsync();

foreach (var contact in contacts) //contacts is underlined
{
    recipients.Recipients.Add(new RecipientsInSmsData() { Id = contact.id,
        FirstName = contact.FirstName,
        LastName = contact.LastName,
        PhoneNumber = contact.PhoneNumber,
        SendingResult = contact.SendingResult
    });
}

编译器错误信息:

foreach 语句无法对“Task”类型的变量进行操作,因为“Task” 不包含“GetEnumerator”的公共实例定义

在 的 after 任务之间它说:

匿名类型:int id, string FirstName, string LastName, string PhoneNumber, string Result

【问题讨论】:

  • 不要在var contacts 中使用var,你会看到你的问题...... async 的东西需要await -ed 这样你才能得到任务的结果和不是任务本身
  • 如果您不介意立即执行,可以将 ToArrayAsync() 替换为 ToList(),然后 foreach 将在列表而不是任务数组上操作
  • @barrypicker 为什么建议创建一个不会被使用的列表?数组在这里更有意义
  • var contacts = await (from c …).ToArrayAsync(); 一切都会好起来的。
  • 您也不需要投影到匿名类型,只需执行 select new RecipientsInSmsData { ... } 并将其从 foreach 中删除

标签: c# entity-framework linq foreach


【解决方案1】:

异步操作需要awaited 才能得到结果,documentation 是学习如何使用asyncawait 的一个很好的起点。
这里的另一个问题是,如果正确使用 LINQ,foreach 是不必要的:

var contacts = await (
            from c in _db.Contacts
            join dgm in _db.DistributionGroupMembers on c.Id equals dgm.ContactId
            join dg in _db.DistributionGroups on dgm.DistributionGroupId equals dg.Id
            join dgis in _db.DistributionGroupInSms on dg.Id equals dgis.DistributionGroupId
            where dgis.SmsId == SmsId
            select new RecipientsInSmsData
            {
                Id = c.Id,
                FirstName = c.FirstName,
                LastName = c.LastName,
                PhoneNumber = c.PhoneNumber,
                Result = "Waiting to be sent"
            })
            .Distinct()
            .ToArrayAsync();

recipients.Recipients.AddRange(contacts);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多