所有 LINQ 查询操作都由以下三个不同的操作组成:
1.获取数据源。
2.创建查询。
3.执行查询。
这里的第二步仅仅是创建查询条件(一个匿名函数),查询条件里面是不包含查询结果的。
真正的执行是在第三步里,这个感念,被称为“延迟执行”。
要LINQ查询强制立即执行可以使用ToArray和ToList方法。
如果要对数据源执行聚合函数的查询如:Count、Max、Average 和 First ,也会导致此LINQ执行强制立即查询。
LINQ 的关键字:
对于一个LINQ查询,form关键字是必然存在的,select或group关键字也是必然存在的,
因为它必须是以select关键字开头和以select或group关键字结尾。
FORM 子句:
form子句需要指定查询或子查询的数据源和一个本地范围变量。最简单的就如上面代码:
在某些情况下,源序列中的每个元素本身可能是序列,也可能包含序列,这时就需要用到 复合 from 子句 。
复合 from 子句用于访问单个数据源中的内部集合。
不过,查询还可以包含多个可从独立数据源生成补充查询的 from 子句。
这段代码将会输出upperCase和lowerCase的笛卡尔乘积。
WHERE 子句:
where子句用于指定将在查询表达式中返回数据源中的哪些元素。GROUP 子句
group子句返回一个 IGrouping(TKey, TElement) 对象序列,这些对象包含零个或更多个与该组的键值匹配的项。也就是说,group子句出来的对象其实就是一个列表,
group子句由两个部分组成,group关键字之后的对象指名返回列表对象的类型,by关键字之后的是如果分组的条件。
分组条件的标识将会记录在返回对象列表的key属性中。
示例:
INTO 子句:
into 为上下文关键字创建一个临时标识符,以便将 group、join 或 select 子句的结果存储到新的标识符中。在 group 或 select 子句中使用新标识符的用法有时称为“延续”。
ORDERBY 子句:
orderby子句可使返回的序列或子序列(组)按升序或降序排序。JOIN 子句:
join子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联。唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。
JOIN 链接一般能分为3种:
内部连接:
这里出现了一个新的运算符: equals
这个运算符是LINQ独有的,执行等同链接,equals 与 == 运算符之间的一个重要的区别。
对于 equals,左键使用外部源序列,而右键使用内部源序列。外部源仅在 equals 的左侧位于范围内,
而内部源序列仅在其右侧位于范围内。
分组联接:
含有 into 表达式的 join 子句称为分组联接。
左外部联接:
在左外部联接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。