Linq 语言集成查询:可以使用相同的语法访问不同的数据源。
查询表达式必须以from字句开头,以select或group自居结束,在这两个字句之间,可以使用where,orderby,join,let和其他from子句。
注意:变量query只指定了Linq查询,该查询不是通过这个赋值语句执行的,只要使用foreach循环访问查询,该查询就会执行。
Linq为IEnumerable<T>接口提供了了各种扩展方法。
调用扩展方法只是调用静态方法的一种新语法。
一:推迟查询执行
在运行期间定义查询表达式时,查询就不会运行,查询会在迭代数据项时运行
每次在迭代中使用查询时,都会调用扩展方法。在大多数情况中,是非常有效的,因为我们可以检测出源数据中的变化。但是,扩展方法ToArray()、ToList()等可以改变这个操作。
上面这句话的意思是:像Where()、First()等扩展方法是推迟查询的要等到使用它的时候才会用到。
但是像ToArray()和ToList()等不是延迟查询 调用这种扩展方法后直接得到相应的数据,而非延迟查询。
1 //延迟查询 2 var names = new List<string> {"Nino", "Alberto", "Juan", "Mike", "Phil"}; 3 var namesWithJ = (from n in names where n.StartsWith("J") orderby n select n); 4 Console.WriteLine("First iteration"); 5 foreach (string name in namesWithJ) 6 { 7 Console.WriteLine(name); 8 } 9 10 Console.WriteLine(); 11 names.Add("John"); 12 names.Add("Jim"); 13 names.Add("Jack"); 14 names.Add("Denny"); 15 Console.WriteLine("Second iteration"); 16 foreach (var item in namesWithJ) 17 { 18 Console.WriteLine(item); 19 } 20 Console.ReadKey();
1 //ToList() 2 var names = new List<string> {"Nino", "Alberto", "Juan", "Mike", "Phil"}; 3 var namesWithJ = (from n in names where n.StartsWith("J") orderby n select n).ToList(); 4 Console.WriteLine("First iteration"); 5 foreach (string name in namesWithJ) 6 { 7 Console.WriteLine(name); 8 } 9 10 Console.WriteLine(); 11 names.Add("John"); 12 names.Add("Jim"); 13 names.Add("Jack"); 14 names.Add("Denny"); 15 Console.WriteLine("Second iteration"); 16 foreach (var item in namesWithJ) 17 { 18 Console.WriteLine(item); 19 } 20 Console.ReadKey();
输出结果:
二:Linq标准查询操作符
Linq查询操作符用例例子下一章节说明