第一次where
条件为真后是否可以停止查询?
我想只获得第一条记录,它的时间大于timeParameter
。我现在拥有的是:
var records = from rec in table
where rec.time > timeParameter
select rec;
return records.FirstOrDefault();
数据库中的时间列按升序排序,因此第一次where条件为true时,无需继续查询。 我在数据库中有很多行,所以我希望查询尽快停止。
答案 0 :(得分:2)
您当前的代码将按照您的要求进行操作。
.FirstOrDefault()
方法短路。在这种情况下,它会生成一个以SELECT TOP 1 ...
开头的SQL查询,SQL Server引擎知道这意味着它可以在找到第一个项目后停止评估。
当你说:
数据库中的时间列按升序排序......
你的意思是整个表按时间列升序排序吗?如果是这种情况,那么这些元素的自然顺序可能是正确的。不过,我会在那里抛出order by
声明,以确保您获得所需的订单。最糟糕的情况是查询引擎会将其丢弃为不必要的。
var records = from rec in table
where rec.time > timeParameter
order by rec.time
select rec;
return records.FirstOrDefault();
答案 1 :(得分:2)
实际上应该停止。 records
是IQueryable,因此在您请求数据(通过FirstOrDefault)之前不会运行,这将添加适当的停止。
基本上,当您将records
变量分配给LINQ语句时,它只会像SQL WILL 那样加载到内存中。但是,在您实际调用访问数据之前,它不会评估任何内容。此时,SQL将根据您使用的任何扩展方法(在本例中为FirstOrDefault
)进行适当修改并实际执行。
然而,正如Andrew Barber指出的那样,您的查询需要实际陈述order by
,否则它将在没有它的情况下运行。 (除非表格在数据库端真正按照DangerMonkey对应点进行排序)
from rec in table
where rec.time > timeParameter
order by rec.time
select rec;
PS。如果您想真正了解其工作原理,那么您可以查看Expression Trees和deferred execution