c# - 在 foreach 循环中等待的正确方法

标签 c# async-await c#-8.0 ef-core-3.0 iasyncenumerable

这是在使用 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();
}

最佳答案

我同意Johnathan Barclay's answer但会说,从数据库的角度来看,您可能会发现执行单个查询大查询比执行大量小查询更快。

执行一次查询并传入所有 ID 通常比多个单独的查询便宜。

public async Task<IList<ContactAndAccounts>> GetAll()
{
    var accounts = await _dbContext.Account.Where(x => x.Name == "Amazing").ToListAsync();

    var contacts = await GetContacts(accounts.Select(o => o.Id));

    // Map contacts to accounts in memory

    return accounts;
}

public async Task<IList<contact>> GetContacts(List<Guid> ids)
{
    return await _dbContext.Contact.Where(x => ids.Contain(x.AccountLinkId)).ToListAsync();
}

关于c# - 在 foreach 循环中等待的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59984516/

相关文章:

c# - 具有泛型返回类型的可空引用类型

c# - 将类作为参数传递

c# - 分配给空委托(delegate)的事件声明

javascript - 为什么 jQuery 不添加类 "drop1"?

c# - 如何等待IAsyncEnumerable <>的所有结果?

c# - 使用 .NET 5 SDK 构建时引用类型错误的可空性差异

c# - WebApi Controller 没有找到 Controller 的操作

c# - 如何扩展对象层次结构以保存额外数据?

c# - 在 .NET 4.0 中使用 task.run 与 task.run 和 continuewith 进行异步/等待

javascript - 由于异步生成器中的非并行等待 promise 而减速