LINQ查询执行的时机
查询分为以下三步:获取数据源、定义查询、执行查询;
定义查询后,查询直到需要枚举结果时才被真正执行,这种方式称为“延迟执行(deferred execution)”;
当查询方法返回单一值时,查询立即执行;
因此,可以通过以下技巧在定义查询时就强制执行查询;
LINQ查询的两种方式
Method Syntax, 查询方法方式
主要利用 System.Linq.Enumerable 类中定义的扩展方法和 Lambda 表达式方式进行查询
Query Syntax, 查询语句方式
一种更接近 SQL 语法的查询方式,可读性更好
查询语句vs查询方法
查询语句与查询方法存在着紧密的关系
1、CLR(CLR是公共语言运行时,Common Language Runtime ,它负责资源管理(内存分配和垃圾收集),
并保证应用和底层操作系统之间必要的分离)本身并不理解查询语句,它只理解查询方法
2、编译器负责在编译时将查询语句翻译为查询方法
3、大部分查询方法都有对应的查询语句形式:如 Select() 对应 select 、 OrderBy() 对应 orderby
4、部分查询方法目前在C#中还没有对应的查询语句:如 Count()和Max() 这时只能采用以下替代方案
查询方法
查询语句 + 查询方法的混合方式;
5、一般情况下,建议使用可读性更好的查询语句
练习:使用上一章的对象数组 foxRiver8,对 foxRiver8 中的对象按照先年龄后姓名方式排序
使用查询语句实现
使用查询方法实现
高级查询方法
聚合类
Count,Max/Min,Average,sum
排序类
ThenBy
分区类
Take,TakeWhile,Skip,SkipWhile
集合类
Distinct
生成类
Range, Repeat
使用生成类查询方法时,需要注意以下几点:
1、和其他几类方法不同,Range/Repeat 不是扩展方法,而是普通的静态方法
2、Range 只能产生整数序列
3、Repeat 可以产生泛型序列
4、所有的查询方法都存放在 System.Linq.Enumerable 静态类中