为什么强制实现使用ToList()
会使我的查询速度提高几个数量级,如果有的话,它应该做完全相反的事情?
First()
1)立即调用
// "Context" is an Entity Framework DB-first model
var query = from x in Context.Users
where x.Username.ToLower().Equals(User.Identity.Name.ToLower())
select x;
var User = query.First();
// ** The above takes 30+ seconds to run **
2)调用First()
后调用ToList()
:
var query = from x in Context.Users
where x.Username.ToLower().Equals(User.Identity.Name.ToLower())
select x;
var User = query.ToList().First(); // Added ToList() before First()
// ** Now it takes < 1 second to run! **
更新和解决
得到生成的 SQL 后,唯一的区别是,不出所料,TOP (1)
在第一个查询中添加了。正如Andyz Smith在下面的回答中所说,根本原因是在这种特殊情况下,SQL Server 优化器在TOP (1)
添加时选择了更差的执行计划。因此,问题与 LINQ 无关(它通过添加 做了正确的事情TOP (1)
)以及与 SQL Server 的特性有关的一切。