在第一次where条件为真之后是否可以停止查询? (linq to sql)

时间:2012-04-26 14:27:25

标签: c# linq-to-sql

第一次where条件为真后是否可以停止查询?

我想只获得第一条记录,它的时间大于timeParameter。我现在拥有的是:

var records = from rec in table
              where rec.time > timeParameter
              select rec;
return records.FirstOrDefault();

数据库中的时间列按升序排序,因此第一次where条件为true时,无需继续查询。 我在数据库中有很多行,所以我希望查询尽快停止。

2 个答案:

答案 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)

实际上应该停止。 recordsIQueryable,因此在您请求数据(通过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 Treesdeferred execution