打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CSharpThinking---查询表达式与Linq to Objects(五)
本文不会按照“由浅入深”的思路来讲解概念,相反从特性的本质及关联讲起,最后简单介绍一些“小技巧”和需要注意的地方,着实有头重脚轻的感觉。--- 史蒂芬King

  

一,概念

  1.1 查询表达式起源

     C#语言的设计者决定在C#3中提供一个新的语法:查询表达式。

       以此弥补复杂语句中标准查询运算符的难以理解、复杂与提高与Sql语句的相似度来便于学习(查询表达式与SQL最大的区别是from与Select的位置倒置,这是为IDE提供智能感知的”推断“类型功能)。

     上面的例子是简洁版查询表达式的一个Demo,查询表达式其实是对底层API的一系列方法的调用。CIL本身并不理解“查询表达式”的概念。事实上,除了涉及表达式树的地方能使用查询表达式,但底层CLR根本没有改动,相反,查询表达式是通过

C#编译器的改动来支持这一特性的。

    以上代码编译之后通过,IL查看的部分编码如下:

    通过对编译后的DLL分析,得出两个结论:

      1) 查询表达式确实被编译成了委托,也就是说是编译器执行了代码,而非运行时或CLR支持。

      2) 由于编译时已经生成了委托,所以大多数查询表达式也是”延迟执行“方式。

    注:

      与延迟执行相反的是"即时执行":非返回IEnumerable或IQueryable类型的单一返回类型,但如果在查询表达式中整体上依然是延迟执行。例如:  XXX.count()

 

  1.2 查询表达式的流处操作与缓冲操作

    1) 缓冲操作:将所有数据一次性加载进内存,然后运算,最后输出结果。如Enumerable.Revense。

    2) 流操作:一次处理每个序列的一个元素,提高效率。如下:

    3)join子句的内联:左边的子句是流处理方式,右边的子句是缓冲方式,这种操作依然是延迟操作。(原则:效率至上,所以尽可能的右边序列要小。

 

  1.3 查询表达式与点标记(Dot notation)之间做出的选择

    点标记:用普通的C#调用Linq查询操作符来代替查询表达式。(实际上编译器转化查询表达式也是如此的过程)

    原则:更加的可读性及习惯性。查询表达式更像是函数式编程,结构化思维;而点标记适合查询条件比较少时清晰易懂。

                 查询表达式是”说明性“的,与之相对的是”命令性“的语言,说明性的语言关心的是操作步骤而绝非仅仅是结果。

   

二,查询表达式操作符

  2.1 From 与 Select 

    2.1.1 语法: from element select source, 以from开头,以select结尾,其中 element 只是一个标示符,select子句被称为投影。

     2.1.2 退化的查询表达式

      当select子句什么都不做时会发生什么?答:编译器依然会生成select方法的调用。

        然而,这个表达式和简单表达式Sample.Allusers还是有很大不同的,虽说他们返回的数据项时相同的,不同的是查询表达式返回的是一个新的结果集,对结果集顺序改变不会改变原数据集顺序,但如果改变数据项,则原数据也会改变。

 

    2.2 Where和OrderBy

    2.2.1 OrderBy:ascending升序,descending降序 或者 OrderByDescending。OrderBy如果要继续查询需跟随ThenBy,如若存在多个OrderBy,则最后一个OrderBy“获胜”。

    2.2.2 Where:

 

  2.3 let子句

    消除不必要的重复“调用”

 

  2.4 联接join

    2.4.1 定义:他使用两张数据表(视图,表值函数等),通过匹配两者之间的数据行来创建结果。

           左边序列进行“流处理“,右边序列进行缓冲处理。

    2.4.2 join子句的内连接

    2.4.3 使用join...into 子句进行分组联接

  

  2.5 分组和查询延续

    2.5.1 语法: group 投影 by 分组

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
LINQ基本子句
Linq学习笔记
C# lamda表达式练习实例
C#高级篇——初识LINQ
LINQ标准查询操作符详解
LINQ操作符四:排序操作符
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服