Language Integrated Query(LINQ,语言集成查询)。通过LINQ,我们可以使用相同API操作不同的数据源。
再此之前,需要先了解的相关技术
1.隐式类型、匿名类型、对象初始化器
隐式类型,使用var关键字创建,C#编译器会根据用于初始化局部变量的初始值推断出变量的数据类型。(不过我个人认为,能用具体类型的地方尽量不要用var关键字,因为这样会让你遗忘“被封装类库”方法的返回值类型--有损可读性)
隐式类型使用限制:
隐式类型只能应用于方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员。
使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。
匿名类型,只是一个继承了Object的、没有名称的类。C#编译器会在编译时自动生成名称唯一的类。
对象初始化器,提供一种非常简洁的方式来创建对象和为对象的属性赋值。(相关还有“集合初始化器”)
由于C#强类型语言,即我们在声明变量时必须指定变量的具体类型。所以在创建匿名对象时,需要结合隐式类型、匿名类型、对象初始化器一起创建匿名对象。(避免类型转换)
示例:
var person = new { name = “heyuquan” , age = 24 }
2. Lambda表达式,Func委托
Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用。
Lambda表达式在C#中的写法是“arg-list => expr-body”,“=>”符号左边为表达式的参数列表,右边则是表达式体(body)。参数列表可以包含0到多个参数,参数之间使用逗号分割。
Func委托
Func委托,是微软为我们预定义的常用委托,封装一个具有:零个或多个指定类型的输入参数并返回一个指定类型的结果值的方法。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
3. 扩展方法:具体见:http://www.cnblogs.com/Huaran1chendu/p/5081259.html
1. 扩展方法声明在静态类中,定义为一个静态方法,其第一个参数需要使用this关键字标识,指示它所扩展的类型。
2. 扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个接口的任何类中,这样多个类就可以使用相同的实现代码。(LINQ中, System.Linq.Queryable.cs和System.Linq.Enumerable.cs 正是对接口添加扩展方法)
3. 扩展方法虽定义为一个静态方法,但其调用时不必提供定义静态方法的类名,只需引入对应的命名空间,访问方式同实例方法。
4. 扩展方法不能访问它所扩展的类型的私有成员。
示例:
1 2 3 4 5 6 7 8 9 |
|
下面是linq的知识:
Linq分为Linq表达式和Linq查询方法
Linq主要分为三种:Linq To Object,Linq To ADO.NET,LINQ To XML
LINQ表达式关键字
from 指定数据源和范围变量
where 根据布尔表达式(由逻辑与 或 等组成)从数据源中筛选元素 一个表达式中可以有多个where字句
select 指定查询结果中的元素所具有的类型或表现形式
group 对对查询结果按照键值进行分组 并且提取出数据 有select的作用
into 提供一个标示符,它可以充当对 join group 或 select 子句结果的引用 将其查询的数据保存在一个临时的集合
orderby 对查询出的元素进行排序 一个orderby字句可以有多个排序条件,但如果有多个orderby字句 以最后一个为准
join 按照匹配条件来联接数据源
let 产生一个用于查询表达式中子表达式查询结果的范围变量