c# - Entity Framework Core 中带有 IAsyncEnumerable 的 WHERE 子句会发生什么?
问题描述
我正在将使用 Entity Framework 和 SQL Server 数据库的现有应用程序从 .NET Framework 移植到 .NET Core。在 EF6 中,您可以执行以下操作:
private async Task<IEnumerable<T>> GetByExpressionAsync(Expression<Func<T, bool>> where))
{
return await _context.DbSet<T>().Where(where).ToListAsync();
}
假设where
表达式可以在服务器端进行评估,这将转换为 SQL 查询,如SELECT columns FROM table WHERE Foo=1
.
这与 EF Core 中的方法相同。是的,我意识到我没有利用异步流,但请记住这是一个现有的应用程序,我没有时间真正重新设计它。
private async Task<IEnumerable<T>> GetByExpressionAsync(Expression<Func<T, bool>> where))
{
return await _context.DbSet<T>().AsAsyncEnumerable().Where(where.Compile()).ToListAsync();
}
我遇到问题的表有数十万条记录。如果我使用 SQL Profiler,我可以看到没有WHERE
子句,因此 SQL Server 正在返回整个表,这当然不是很理想。一开始我没有注意到,因为我的单元测试是针对一个小得多的表运行的,所以没有迹象表明会有性能问题。
根据Microsoft 文档,“数据库提供程序确定可以在数据库中评估查询的哪些部分”和“查询的这些部分被翻译为特定于数据库的查询语言”。因此,当我使用简单的[column] == [value]
过滤器时,它应该可以正常工作,并且确实,同步工作完全符合预期。
private IEnumerable<T> GetByExpression(Expression<Func<T, bool>> where))
{
return _context.DbSet<T>().AsQueryable().Where(where).ToList();
}
我究竟做错了什么?提前致谢。
解决方案
推荐阅读
- java - 在Java中继承没有父类型的类
- extjs - 创建 ExtJs 后如何不显示面板
- angular - MatTableDataSource:无法读取未定义的属性“长度”
- unity3d - Unity2d如何把人变成僵尸
- javascript - 使用 javascript 从数组更改类的图像失败
- jboss - 在wildfly 12上部署我的战争时出现禁止(4.3)错误
- c# - 在 WPF 中使用 Unity Prism 在 TextBox 中输入时实时更新 TextBlock
- c++ - 下面的单行比较器是如何工作的?C++11
- php - save() 在 Laravel 5.5 中返回 true
- javascript - 尝试在包裹上使用超级代理上传文件时,.on 不是函数错误