【发布时间】: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