linq查询的执行流程

时间:2011-11-03 10:14:28

标签: c# .net linq

情形1

var numbers = new List<int>();
numbers.Add (1);
IEnumerable<int> query = numbers.Select (n => n * 10);    // Build query
numbers.Add (2);

//Use or execute query  

情形2

var numbers = new List<int>() { 1, 2 };
numbers.Add(4);
List<int> query  = numbers
  .Select (n => n * 10) 
  .ToList();                      // Executes immediately into a List<int>
numbers.Add(3);
numbers.Clear();

//Use or execute query

为什么在第一种情况下查询包含1,2

在第二种情况下,查询只包含1,2,4但不包含3,是因为我们正在调用.ToList()方法。

5 个答案:

答案 0 :(得分:5)

这是因为在您开始枚举结果集之前不会执行查询(通过调用.ToArray(),. ToList()或只是编写foreach)

IEnumerable<int> query = numbers.Select (n => n * 10);

不会执行任何操作。这是LINQ的懒惰本质。

答案 1 :(得分:1)

任何返回IEnumerable<T>的Linq方法都是延迟的,这意味着在枚举之前它不会返回项目。

ToList<T>()是非延期的操作。

答案 2 :(得分:0)

在枚举后执行的case1查询。

case2中,结果不包含3,因为您已经执行了查询并在IEnumarable变量中保存了它的结果(query个对象) (并且它不是Linq Query对象。)

答案 3 :(得分:0)

linq使用延迟执行的概念意味着只有当它调用像.first .list等实际工作时它才会执行查询。

答案 4 :(得分:0)

只有当.tolist()调用时,linq才会调用DB并返回actul数据。