LINQ总共包括五个部分:
LINQ查询表达式以from子句开头,以select子句或group子句结束。在两个子句之间,可以使用where、orderby,join,let等查询操作符。具有“延迟计算”的特性。
下面是一个简单的示例,查询一个int数组中小于5的元素,并按照从小到大的顺序排列:
int[] arr = new int[] { 1, 4, 2, 6, 7, 9, 5, 1, 2, 4 }; var query = from r in arr where r < 5 orderby r select r;
foreach (var item in query) { Console.WriteLine(item); } Console.ReadLine();
编译器会在程序编译时转换LINQ查询,以调用相应的扩展方法。
关键字有: from ,where ,select ,group ,into ,orderby,join,let,in,on,equals,by,ascending,descending等。
LINQ查询表达式
关键字 |
功能 |
from…in… |
指定要查找的数据源以及范围变量,多个from子句则表示从多个数据源查找数据。 注意:c#编译器会把“复合from子句”的查询表达式转换为SelectMany()扩展方法。 |
join…in…on…equals… |
指定多个数据源的关联方式 |
let |
引入用于存储查询表达式中子表达式结果的范围变量。通常能达到层次感会更好,使代码更易于阅读。 |
orderby、descending |
指定元素的排序字段和排序方式。当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序方式 |
where |
指定元素的筛选条件。多个where子句则表示了并列条件,必须全部都满足才能入选。每个where子句可以使用谓词&&、||连接多个条件表达式。 |
group |
指定元素的分组字段。 |
select |
指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型。(目前通常被指定为匿名类型) |
into |
提供一个临时的标识符。该标识可以引用join、group和select子句的结果。 1) 直接出现在join子句之后的into关键字会被翻译为GroupJoin。(into之前的查询变量可以继续使用) 2) select或group子句之后的into它会重新开始一个查询,让我们可以继续引入where, orderby和select子句,它是对分步构建查询表达式的一种简写方式。(into之前的查询变量都不可再使用) |
以下扩展方法存在对应的查询表达式关键字:
Where、Select、SelectMany、OrderBy、ThenBy、OrderByDescending、ThenByDescending、GroupBy、Join、GroupJoin。
Enumberable 类定义的标准查询操作符。
类别 |
标准查询操作符 |
说明 |
筛选操作符 |
Where OfType<TResult> |
称为筛选操作符定义返回元素的条件。 Where 使用谓词,返回符合条件的元素。 OfType<TResult> 返回符合类型的元素。 |
投射操作符 |
Select SelectMany |
投射操作符用于把对象转换为另一个类型的新对象。 Select 和 SelectMany 定义根据选择器函数选择结果值的投射。 |
排序操作符 |
OrderBy ThenBy OrderByDescending ThenByDescending Reverse |
排序操作符改变返回的元素的顺序。 Orderby 升序排序。 OrderBydescending 降序排序。 TheBy 和 ThenByDescending 二次排序。 Reverse 反转集合元素。 |
连接操作符 |
Join GroupJoin |
用于合并不直接相关的集合。 Join 根据键选择器函数连接两个集合。 GroupJoin 连接两个集合。 |
组合操作符 |
GroupBy ToLookup |
组合操作符把数据放在组中。 GroupBy 组合公共键的元素。 Tookup 创建一个一对多字典,组合元素。 |
限定操作符 |
Any All Contains |
元素满足指定的条件。 Any 满足谓词函数的函数。 All 所有元素是否都满足谓词函数。 Contains 检查某个元素是否在集合中。 |
分区操作符 |
Take Skip TakeWhile SkipWhile |
返回集合的子集。 Take 从集合提取元素个数。 Skip 跳过指定的元素个数,提取其他元素。 TakeWhile 提取条件为真的元素。 |
Set操作符 |
Distinct Union Intersect Except Zip |
Set操作符返回一个集合。 Distinct 删除重复的元素。 Union 返回集合中唯一元素。 Intersect 返回两个集合都有的元素。 Except 只出现在一个集合中的元素。 Zip 两个集合合并为一个元素。 |
元素操作符 |
First FirstOrDefault Last LastOrDefault ElementAt ElementAtOrDefault Single SingleOrDefault |
元素操作符返回一个元素。 First 返回第一个满足条件的元素。 FirstOrDefault 类似First,如果未找到满足条件元素,返回类型的默认值。 Last 返回最后一个满足条件的元素。 ElementAt 返回元素的位置。 Single 返回一个满足条件的元素。如果有多个元素都满足条件,就抛出一个异常。 |
聚合操作符 |
Count Sum Min Max Average Aggregate |
聚合操作符计算集合值。 Sum 总和。 Count 所有元素个数。 Min 最小元素。 Max 最大元素。 Average 平均值。 Aggregate 根据输入的表达式获取聚合值。 |
转换操作符 |
ToArray AsEnumerable ToList ToDictionary Cast<TResult> |
|
生成操作符 |
Empty Range Repeat |
Empty 空集合。 Range 返回一系列数字。 Repeat 返回始终重复一直的集合。
|
一、 示例业务背景介绍
示例参考《C#高级编程(第六版)》LINQ章节(P267 - P296),进行改编。
打开示例代码我们看到:
1. Racer.cs 文件,定义一级方程式世界车手冠军信息。
2. Team.cs 文件,定义一级方程式世界车队冠军信息。
3. Formula1.cs 文件,包含两个重要静态方法:(F1是"Formula One"的缩写)
1) GetChampions():返回一组车手列表。这个列表包含了1950到2007年之间的所有一级方程式世界车手冠军。
2) GetContructorChampions():返回一组车队列表。这个列表包含了1985到2007年之间的所有一级方程式世界车队冠军.
原文:https://www.cnblogs.com/springsnow/p/11286711.html