C#语言的设计者决定在C#3中提供一个新的语法:查询表达式。
以此弥补复杂语句中标准查询运算符的难以理解、复杂与提高与Sql语句的相似度来便于学习(查询表达式与SQL最大的区别是from与Select的位置倒置,这是为IDE提供智能感知的”推断“类型功能)。
1) 查询表达式确实被编译成了委托,也就是说是编译器执行了代码,而非运行时或CLR支持。
2) 由于编译时已经生成了委托,所以大多数查询表达式也是”延迟执行“方式。
与延迟执行相反的是"即时执行":非返回IEnumerable或IQueryable类型的单一返回类型,但如果在查询表达式中整体上依然是延迟执行。例如: XXX.count()
1) 缓冲操作:将所有数据一次性加载进内存,然后运算,最后输出结果。如Enumerable.Revense。
3)join子句的内联:左边的子句是流处理方式,右边的子句是缓冲方式,这种操作依然是延迟操作。(原则:效率至上,所以尽可能的右边序列要小。)
1 // 语法2 join right-range-variable in right-sequence3 on left-key-selector equals right-key-selector
1.3 查询表达式与点标记(Dot notation)之间做出的选择
点标记:用普通的C#调用Linq查询操作符来代替查询表达式。(实际上编译器转化查询表达式也是如此的过程)
原则:更加的可读性及习惯性。查询表达式更像是函数式编程,结构化思维;而点标记适合查询条件比较少时清晰易懂。
查询表达式是”说明性“的,与之相对的是”命令性“的语言,说明性的语言关心的是操作步骤而绝非仅仅是结果。
2.1.1 语法: from element select source, 以from开头,以select结尾,其中 element 只是一个标示符,select子句被称为投影。
当select子句什么都不做时会发生什么?答:编译器依然会生成select方法的调用。
2.4.1 定义:他使用两张数据表(视图,表值函数等),通过匹配两者之间的数据行来创建结果。
联系客服