C#入门系列 (二十八) -- LINQ 的查询语法
1. LINQ 的两种语法
写 LINQ 时有两种形式的语法:(1)查询语法(query syntax)查询语法是声明形式的,使用查询表达式形式来书写。(2)方法语法(method syntax)方法语法是命令形式的,它使用的是标准的方法调用。方法是一组叫做标准查询运算符的方法。
微软推荐使用查询语法,因为它更易读,能更清晰的表明查询意图,因此也不容易出错。然而,有一些运算符必须使用方法语法来书写。
所以我们通常在一个查询中可以使用两种方法的组合。查询表达式使用的查询语法会被 C#编译器转换为方法调用的形式、这两种形式在运行时性能上没有区别。
2. 查询变量
LINQ 查询可以返回两种类型的结果:(1)可枚举的一组数据,它列出了满足查询参数的项列表;(2)标量,它是满足查询条件的结果的某种摘要形式。
LINQ 查询返回两种类型结果的差别还在于查询执行的时间:(1)如果查询表达式返回可枚举的一组数据,查询一直到处理枚举时才会被执行。如果枚举被处理多次,则查询会被执行多次;如果在进行便利之后,查询执行之前数据有改动,则查询会使用新的数据。(2)如果查询表达式返回标量,查询立刻执行,并且把结果保存在查询变量中。
3. 查询表达式的结构
1)from 子句
from 子句指定了要作为数据源使用的数据集合。语法格式如下所示:
==from 数据类型 迭代变量 in 要查询的数据源==
对 from 子句的说明如下:① 迭代变量有序表示数据源的每一个元素;② 数据类型是集合中元素的类型,数据类型是可选的,因为编译器会从集合来自动推断出迭代变量的类型;③ 要查询的集合必须是可以枚举的。
2)where 子句
where 子句根据之后的运算来去除不符合指定条件的项。如下所示是 where 子句的语法:
==where 布尔表达式==
where 子句将布尔表达式,即谓词,应用于由迭代变量引用的每个源元素,并返回满足指定条件的元素。
使用 where 子句需注意以下几点:(1)where 子句是一种筛选机制,它不能是查询表达式中的第一个或最后一个子句;(2)如果 where 子句中设定的布尔表达式对当前数据源的元素无效,则会发生编译错误;(3)编译时,where 关键字会被转换为 where 标准查询运算符方法的调用。
3)select 子句
select 子句指定所选择的对象那部分应该被选择。它可以指定下面的任意一项:(1)整个数据项(2)数据项的一个字段(3)数据项中的几个字段组成的新对象(或类似其他值)
select 子句的结果基于前面所有子句的计算结果以及 select 子句本身的所有表达式。
==查询表达式必须以 select 子句或 group 子句结束。==
4)group 子句
group 子句是可选的,用来指定选定的项如何被分组。使用 group 子句的注意事项如下:(1)如果项包括在查询的结果中,就可以根据某个字段的值进行分组。作为分组依据的项叫做键;(2)group 子句不从原始的数据源中返回可枚举项的枚举类型,而是返回已经形成的可以枚举项的分组的可枚举类型;(3)分组本身是可枚举类型,它们可以枚举实际的项。
使用示例:
5)orderby 子句
orderby 子句接受一个表达式并根据表达式依次返回结果项 orderby 子句的语法如下所示:==orderby 表达式 [ ascending |descending]]==
不写后缀默认是升序排序方式,可以有任意多个 orderby 子句,但是必须使用逗号分割。
上面这个例子使用 Age 这个字段,也可以使用 Name 这个字段会根据英文字母排序,若 Name 有中文也是可以排序的,可以自行尝试下.
版权声明: 本文为 InfoQ 作者【陈言必行】的原创文章。
原文链接:【http://xie.infoq.cn/article/6de20043ba16300f45f2a1957】。未经作者许可,禁止转载。
评论