首页 > 代码库 > LINQ学习笔记
LINQ学习笔记
基础概念
LINQ是微软推出的一项具有突破性的新特性——语言集成查询(Language Integrate Query),他在对象和数据间建立了一种对应关系,可以使用访问内存对象的方式查询数据集合
在.NET类库中,LINQ相关类库都在System.Linq命名空间下,对于目前程序需要用到的是LINQ to Object,数据源为实现了接口IEumerable<T>或IQueryable<T>的内存数据集合,对于本程序也就是List<T>集合
LINQ查询的目的是从制定的数据源中查询满足符合特定条件的数据元素,并且根据需要对这些查询的元素进行排序、连接等操作,所以LINQ查询主要包括如下几个元素
数据源:表示LINQ将从哪里查找数据,通常是一个或多个数据集,数据集包含一系列元素,是一个类型为IEumerable<T>或IQueryable<T>的对象,可以对它进行枚举,遍历每一个元素,元素可以是任意数据类型
目标数据:数据源中的数据并不都是查询所需要的结果,目标数据用来指定具体想要什么数据,在LINQ中,它定义了查询结果数据集中元素的具体类型
筛选条件:筛选条件定义了对数据源中元素的过滤条件,只有满足条件的原素材作为查询结果返回,帅选条件可以是简单的逻辑表达式表示,也可以用具有复杂逻辑的函数来表示
附加操作:表示一些其他的操作,比如排序、计算查询结果的最值和求和、对查询结果进行分组等
数据源和目标数据是必备元素,筛选和附加操作是可选元素
查询表达式
查询表达式是LINQ查询的基础,也是最常用的编写LINQ查询的方法。有查询关键字和对应的操作数组成的表达式整体
查询表达关键字
关键字 |
功能 |
from |
指定要查找的数据源及范围变量,多个from字句则表示从多个数据源查找数据 |
select |
指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型 |
where |
指定元素的筛选条件,多个where子句则表示并列条件,必须全部都满足才能入选 |
orderby |
指定元素的排序字段和排序方式,当有多个排序字段时,由字段顺序确定主次关系,可以指定升序和降序两种排序方式 |
group |
指定元素的分组字段 |
join |
指定多个数据源的关联方式 |
from
每个LINQ查询都是从from子句开始,其一般包括以下两个功能
制定查询将采用数据源
定义一个本地变量,表示数据源中单个元素
格式为from localVar in dataSource,一般不为localVar元素指定数据类型,由编译器自动分配类型
select
LINQ查询表达式必须以select或者group子句结束,格式如下
select element
element参数指定查询结果中元素的类型及初始化方式
要选择的目标数据不仅可以为数据源中的元素,还可以是该元素的不同操作结果,包括属性、方法和运算等
可以使用匿名类型,进一步学习
where
格式如下
where expression
expression为一个逻辑表达式,可以使用&&和||指定多个条件之间的逻辑运算关系
orderby
格式如下
orderby element [sortType]
默认是ascending
可以同时指定多个排序元素,也可为每个排序元素制定独立的排序方式
group
实现对查询结果的分组操作,常用格式如下
group element by key
key表示分组条件,group子句返回类型为IGrouping< Tkey,TElement>的查询结果,可以看作一个内部嵌套List列表的Hashtable,
如果需要对分组的结果进行排序,再次查询等操作,需要使用into关键字将Group的查询结果保存到一个临时变量,其格式为
group element by key into tmpGrp
join
通过join子句联接操作,可以将来自不同源序列,并且在对象模型中没有直接联系的元素相关联,唯一的要求是每个源中需要共享某个可以进行比较,以判断是否相等的值
可以实现三种联接:内部联接、分组联接、左右联接
内部联接
格式如下
join element in dataSource on exp1 equals exp2
exp1和exp2表示两个表达式,它们具有相同的数据类型
分组联接
join element in dataSource on exp1 equals exp2 into grpName
into表示将这些数据分组并保存到grpName中
左外部联接
LINQ查询方法
IEumerable<T>接口
主要方法有
数值运算:Sum,Average,Max,Min
元素数量Count,LongCount
取值:First,Last,ElementAt
提取子集:Skip,SkipWhile,Take,TakeWhile
集合操作:ReverseAll,Concat,Except,Intersect,Union,Distinct,SequenceEqual
其他:Any,Contains,ToArray,ToList…
Lambda表达式
基本格式
(input parameters)=>expression
parameters是一个参数列表,在Lambda表达式中只有一个输入参数时可以不用括号,否则括号是必须的,两个及以上参数用逗号隔离,没有参数时使用空括号表示
使用关键字对应方法进行一系列操作
LINQ学习笔记