目录
- 前言
- 一、Linq To Object
- 1、linq扩展方法
- (1)本质
- (2)延伸
- (3)常用扩展方法
- <1> Where
- <2> Select(投影)
- <3> First和FirstOrDefault
- <4> Last和LastOrDefault
- <5> Single和SingleOrDefault
- <6> Union和Concat
- <7> Except 取差集
- <8> Count、Any和All
- <9> Skip和Take 分页
- <10> SkipWhile和TakeWhile
- <11> Distinct 去重
- <12> ToDictionary 字典转换
- <13> Range和Repeat
- <14> GroupBy 分组
- <15>OrderBy、OrderByDescending和ThenBy、ThenByDescending
- <15> DefaultEmpty 空替换
- <16> SequenceEqual 集合相等
- <17> Zip 拉链(配对)
- <18> OfType和Cast
- <19> ToLookup 索引式查找
- <20> SelectMany 集合降维
- <21> Aggregate 聚合
- <22> Join (inner join)
- <23> GroupJoin
- <24> 其他
- 2、Linq表达式
- 二、Linq To Xml
- 三、本文代码
前言
在C#中,从功能上Linq可以分为两类:linq to object 和 linq to provider(如xml);从语法上可以分为linq 表达式和linq扩展方法,linq表达式和linq扩展方法本质相同,没有任何区别。
一、Linq To Object
linq to object针对IEnumerable类型数据。
- IEnumerable类型数据:可以理解为内存数据
- IQueryable类型数据:可以内存数据,也可以是数据库数据
注意: IEnumerable类型的扩展的方法和IQueryable类型扩展方法本质不同,IQueryable类型扩展方法是将可变逻辑封装成表达式目录树(数据结构)
1、linq扩展方法
(1)本质
把不变的逻辑封装起来,把可变的逻辑封装成委托来传递,让开发者只关注自己的核心业务逻辑。
(2)延伸
- Linq To Sql:打开数据库连接、查询数据(不变的逻辑)封装起来,把sql拼接(可变的逻辑)封装成委托。
- Linq To Xml:数据解析(不变的逻辑)封装起来,筛选条件(可变逻辑)封装成委托传递
- Linq To Redis:把固定的逻辑封装起来,可变的逻辑封装成委托(未实现)
- Linq To Cache:同上(未实现)
- Linq To Json:同上(未实现)
- Linq To Everything:同上(未实现)
因此:Linq是一种封装思想,对于使用者而言,不用关注内部实现,只需要调用即可。
(3)常用扩展方法
<1> Where
<2> Select(投影)
Select被称作投影,可以基于数据源投影出一个新的对象(实体对象或者匿名对象均可),以便保留有效的属性或者字段
<3> First和FirstOrDefault
查询第一条数据
- First:如果集合是空的,会报错
- FirstOrDefault:如果集合是空的,不会报错,返回默认值
<4> Last和LastOrDefault
查询最后一条数据
- Last:如果集合是空的,会报错
- LastOrDefault:如果集合是空的,不会报错,返回默认值
<5> Single和SingleOrDefault
查询第一条数据
- Single:如果集合是空的,会报错
- SingleOrDefault:如果集合是空的,不会报错,返回默认值
<6> Union和Concat
合并两个集合
- Union:会自动去重
- Concat:保留重复的
<7> Except 取差集
<8> Count、Any和All
- Count:计算集合总条数
- Any:判断集合中是否存在任意一个元素符合条件
- All:判断集合中所有元素是否符合条件
<9> Skip和Take 分页
- Skip:从起始位置(索引为0)起跳过指定的元素个数
- Take:读取指定的条数
<10> SkipWhile和TakeWhile
- SkipWhile:从起始位置开始忽略指定元素,直到匹配到不符合条件的元素就停止忽略,返回后面的结果。
- TakeWhile:从起始位置读取符合条件的元素,一旦遇到不符合条件的元素就立即停止读取,后面的也不再读取。
<11> Distinct 去重
<12> ToDictionary 字典转换
将集合转换成字典
注意:key不能重复,也就是说集合的元素不能重复
也可以自定义key,value
<13> Range和Repeat
列表生成式:用于生成集合
<14> GroupBy 分组
<15>OrderBy、OrderByDescending和ThenBy、ThenByDescending
- OrderBy:正向排序
- OrderByDescending:逆向排序
- ThenBy和ThenByDescending:配合OrderBy、OrderByDescending做多条件排序
<15> DefaultEmpty 空替换
没有查到指定元素的时候可以用默认值代替,默认值可以自定义
<16> SequenceEqual 集合相等
判断两个集合对应的各个位置元素是否相等(个数不等,返回值必为false)
<17> Zip 拉链(配对)
将两个集合像拉链一样,按照位置索引对应配对起来,如果两个集合元素数量不同,多出来的元素会被舍弃。
<18> OfType和Cast
类型过滤与转换
<19> ToLookup 索引式查找
返回可索引查找的数据结构,根据指定条件计算结果(键)将集合分组,并按条件计算结果(键)进行索引。
<20> SelectMany 集合降维
笛卡尔积运算
多维数组笛卡尔积运算
<21> Aggregate 聚合
<22> Join (inner join)
<23> GroupJoin
以left join 为例
<24> 其他
后续完善。。。。
2、Linq表达式
(1)本质
linq表达式和linq扩展方法本质相同,没有区别,linq表达式最终会被编译器成linq扩展方法。
编译前
编译后
(2)常用表达式
<1> from … in … where … select …
List<int> list1 = new List<int> { 1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 0 };
List<int> list2 = new List<int> { 1, 20, 30, 4, 50, 5, 60, 6, 70, 8, 90, 9, 0, 100 };
var result = from item in list1
where item > 3
select item;
Console.WriteLine(string.Join(',', result));
等同于where扩展方法
<2> join(相当于sql中的inner join)
等同于Join 扩展方法
<3> join into (Left join)
等同于扩展方法GroupJoin
<4> join into (Right join)
<5> Cross Join
<6> Full Outer Join
<7> 多关键字连接
在sql查询中,如果同时需要多个字段连接两张表的时候,可以用and或者or关键字,但是linq中不支持,那么应该如图连接,创建匿名对象包含连接关键字来作为连接条件
二、Linq To Xml
读取