c# - 我应该在查询时调用 ToListAsync()
问题描述
我不久前还在 C# 中寻找一些如何编写代码的最佳实践。现在,我正在使用 EF Core 并拥有以下代码
var details = _dbContext.Details.Where(x => x.Name == "Button");
foreach(var detail in details)
{
...
}
为了更好地响应,我尝试使用ToListAsync()
like
var details = await _dbContext.Details.Where(x => x.Name == "Button").ToListAsync();
如果我理解,它应该是更有效的方式。我应该一直使用ToListAsync()
吗foreach
?
删除也是一样。第一个
var details = _dbContext.Details.Where(x => x.Id == "Button");
_dbContext.Details.RemoveRange(details);
或者
var details = await _dbContext.Details.Where(x => x.Id == "Button").ToListAsync();
_dbContext.Details.RemoveRange(details);
哪一个会更好?那么,当我不添加时ToListAsync()
,查询会同步运行吗?
解决方案
从操作返回 IEnumerable 会导致序列化程序进行同步集合迭代。结果是调用阻塞和线程池饥饿的可能性。为避免同步枚举,请在返回可枚举之前使用 ToListAsync。
从 ASP.NET Core 3.0 开始,IAsyncEnumerable 可用作异步枚举的 IEnumerable 的替代方案。有关详细信息,请参阅控制器操作返回类型。
有关更多信息,请查看ASP.NET Core 性能最佳实践
推荐阅读
- grails - 将 Grails Shiro 应用程序升级到 Spring Security Shiro,绕过 @Secured("permitAll")
- java - 添加更多项目时不要滚动 TableView
- javascript - JavaScript 中的 .apply() 方法混淆
- ios - Pod 安装:找不到“Foo”的规范
- db2 - 如何在 DB2 中查找查询表的所有对象
- python - 如何通过多个条件过滤变量
- angular - Angular FormArray 中的唯一项目名称验证器
- docker - docker服务和docker容器的区别
- c# - 添加到列表
带有 foreach 循环 - syntax-highlighting - 将 ini 文件的 Atom 编辑器语法高亮显示为 Java 属性