<分区>
为什么使用 ToList()
强制实现会使我的查询速度提高几个数量级,而如果有的话,它应该做的恰恰相反?
1) 立即调用First()
// "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()
after 调用 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 的特性有关。