查询表达式
1.标准点式语法 和 标准表达式法
标准表达式法接近于SQL语法,点式语法则更便于使用。C#语言并没有要求我们必须使用哪种方式,很显然,点式语法是更好的选择。
在标准表达式法中,Select放在了语句的最后,这样做的原因是为了是方便VS的智能提示。
2.点式语法中常用的查询操作:Where,Select,SelectMany,Join,GroupJoin,GroupBy,OrderBy,ThenBy,OrderByDescending,ThenByDescending.
3.查询表达式语法:
1.查询表达式必须以from开头
2.查询表达式必须包含0个或多个from,let,或者 Where从句。from从句是生成一个或多个范围变量结果的产生器,或者join多个连续的结果集。
let从句引用了一个范围变量而且赋值给他。Where从句的作用是从多个结果集中过滤一个结果。
3.在查询语句后跟orderby可以对结果进行排序 , ascending或descending 升序或降序。
4.查询表达式必须跟一个select 或group
5.然后查询表达式可以跟一个可选的从句,可以是into从句也可以是join从句,或者是从2来的一个子句。
透明标识符
(ORZ。。没有中文参考资料。。)
简单的说,是编译器在标准表达式的翻译过程中用到的一种标识,用*号来标识,但不同于SQL语句中的*,而且它只存在于翻译的过程中,一旦表达式的翻译过程完成,这种标识便不再存在。
翻译表达式机制:
1.Select and Group从句
有into的从句,将会进行下面的翻译:
from ...into i....==========> from i in from .....
2.显式枚举变量
一旦表达式中from从句包含一个显示枚举变量,将会进行下面的翻译:
from T e in S =============> from e in s.Cast<T>
如果包含join
Join T e in s on k2,equals k2=========>join e in s.Cast<T> on k2,equals k2
3.Join 从句
from e1 in s1 join e2 in s2 on k2 equals k2 select f
======>
from t in s2.join(s2,e=>k1,e2=>k2,(e1,e2)=>f) select t;
4.如果一个查询表达式包含一个from从句后跟into表达式和select从句,将进行以下的翻译:
from e1 in s1 join e2 in s2 on k1 equals k2 into i select f
======>
from t in s1.GroupJoin(s2,e1=>k1,e2=>k2,(e,i)=>f) Select f
5.如果一个表达式包含from从句后跟join从句,将进行一下的翻译:
from e1 in s1 join e2 in s2 on k1 equals k2
======>
from * in from e1 in s1 join e2 in s2 on k1 equals k2 select new {e1,e2}
6.Let 和 Where 从句
如果查询表达式包含一个from从句,而且后面直接跟这一个let从句,将执行下面的翻译:
from e in s let l=v
=======>
from * in from e1 in s1 select new {e,l=v};
查询语句from后面跟一个where从句,将执行一下翻译:
from e in s where w ======> from e in s.where (e=>w);
7.多个产生器从句
如果查询表达式包含多个from从句,后面跟了一个selelct 从句,将执行下面的翻译:
from e1 in s1 from e2 in s2 select f
=====>
from c in s1.SelectMany(e1=> from e2 in s2 select f) select c;
8.Orderby
from e in s order by o1,o2
=======>
from e in s.orderby(e=>o1).ThenBy(e=>o2);
Chapter 2 Summary
1.var 关键字
2.扩展方法,使给一个类似密封类,或者你没有源码的类对象添加方法成为了可能。
3.Lambda表达式和匿名方法
4.表达式树提供了第三方的数据源
5.分部方法提供了一个轻量级的处理模型。
6.查询表达式