情形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()方法。
答案 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数据。