【发布时间】:2020-01-30 11:03:00
【问题描述】:
这是使用 async 使用 foreach 循环的正确方法吗?有没有更好更有效的方法? IAsyncEnumerable? (忽略两个表可以连接在一起的事实,这是一个简单的例子)
public async Task<IList<ContactAndAccounts>> GetAll()
{
var accounts = await _dbContext.Account.Where(x => x.Name == "Amazing").ToListAsync();
foreach(var account in accounts)
{
accounts.Contacts = await GetContact(account.Id);
}
return accounts;
}
public async Task<IList<contact>> GetContact(Guid id)
{
return await _dbContext.Contact.Where(x => x.AccountLinkId = id).ToListAsync();
}
【问题讨论】:
-
无论如何,您都不应该在单独的查询中获取联系人。你为什么不
Include他们? -
这里的问题与await和loops无关。这是缺失的关系。解决方法是使用
Include(acc=>acc.Contacts)。Account应该有一个Contacts属性,并且 DbContext 应该包含一对多关系 -
使用正确的 dbcontext,查询变为
_dbContext.Account.Include(acc=>acc.Contatcts).Where(...).ToListAsync()。不需要循环 -
@PanagiotisKanavos 我同意,但请阅读原始问题“忽略两个表可以连接在一起的事实,这是一个简单的示例”
-
这是主要问题,不容忽视。其他一切都是创可贴。这不会解决真正的问题。正确的修复比此处发布的每个解决方案都更容易
标签: c# async-await c#-8.0 ef-core-3.0 iasyncenumerable