LINQ 为什么要延迟执行?



 int[] scores = { 10, 90, 100, 30, 70, 29, 45 };

var highScoresQuery = from score in scores
                      where score > 80
                      orderby score descending
                      select score;

上面这段代码会 延迟执行 ,如果使用聚合函数,如:.Count() 就会 立即执行 。为什么要这么做,好处是什么? 为什么 Count() 不采用 延迟执行 呢?

c# linq

春原阳平君 11 years, 9 months ago

linq表达式返回的是 IQueryable 并不是查询结果。延迟执行的目的有几个:

  • 为后续动态表达提供可能。比如你上面的表达式,如果想再加个where条件,而且这个条件加不加事先是不知道的,怎么办呢。
  • 在设计之初就是为sql服务的,即linq to sql,将linq表达式转化成sql表达式

highScoresQuery 是个 IQueryable ,对 IQueryable 执行终结方法(比如 ToList , Count )都将执行表达式遍历、转化、并查询结果。由于Linq的灵活性,派生出了linq的很多其他用法,比如你这个就是Linq to Object。但是不同的linq实现有一些差异,延不延迟不能一概而论,还要看具体实现,但是原则上是会有个表达式遍历和转化的过程的,所以会延迟。

ttmmdd answered 11 years, 9 months ago

Your Answer