Linq
Language Integrated Query语言集成查询。
可以用于从数据库、程序对象的集合、XML文档中查询数据。
from、in、let、join、into、where、orderby、select、group…by
int[] numbers = {
2, 12, 5, 15}; //数据源
IEnumerable<int> lowNums = from n in numbers where n < 10 select n; //定义并存储查询
foreach(var x in lowNums){
Console.WriteLine(x);}
Linq提供程序(provider)
匿名类型
/*只能用var*/var student = new /*没有类名*/{
name = "abc", age = 12};
//student的类型为:<>f__AnonymousType0`2[System.String,System.Int32]
匿名类型对象的属性都是只读的。
匿名类型被构造后,编译器创建了这个类型的对象。
如果编译器遇到了另一个具有相同的参数名、相同的推断类型和相同顺序的匿名类型,它会重用这个类型并直接创建新的实例,不会创建新的匿名类型。
方法语法和查询语法
- 查询语法(query syntax)
声明式(declarative),查询描述的是你想返回的东西,不指明如何执行这个查询。 - 方法语法(method syntax)
命令式(imperative),指明查询方法调用的顺序。
两种语法在运行时没有性能上的差异。
返回值
LINQ查询可返回一个可枚举的数据集,或一个称为标量(scalar)的单一值。
- 返回可枚举的数据集
查询一直到处理枚举时才会被执行。
若枚举被执行多次,查询就会执行多次。
在进行遍历之后,若查询执行之前数据有改动,则查询会使用新的数据。 - 返回标量
查询立即执行,并把结果保存在查询变量(等号左边的变量)中。
查询表达式的结构
from
指定了要作为数据源使用的数据集合,引入了迭代变量。
from子句声明式地规定集合中的每个项都要被访问,并不指定顺序。
from子句创建可以执行查询的后台代码对象,只有在程序的控制流遇到访问查询变量的语句时,才执行查询。
jion
结合多个集合的数据。
联结操作接受两个集合然后创建一个临时的对象集合,每个对象包含原始集合对象的所有字段。
比较相等性只能用equals
关键字,不能用“==”。
var query = from s in students
join c in studentsInCourses on s.StID equals c.StID
let
保存一个需要在其他运算中使用的标识符,标识符存储了某些运算后的结果。
var groupA = new {
1, 2, 3