LINQ进阶

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 静态类中

原文地址:https://www.cnblogs.com/guosongORxiaosong/p/2922054.html