第二章 LinQ查询简介
什么是LINQ:
LINQ( Language Integrated Query )即语言集成查询
LINQ 是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库、MySql数据库、Oracle数据库等等。
LINQ 主要包含以下三部分:
LINQ to Objects 主要负责对象的查询
LINQ to XML 主要负责 XML 的查询
LINQ to ADO.NET 主要负责数据库的查询
LINQ to SQL
LINQ to DataSet
LINQ to Entities
LINQ的基本查询:
所有LinQ查询操作都包括以下三个不同的操作:
1.创建数据源:这里的数据源可以是数组,集合,XML,SQL等数据库
2.新建一个查询:
语法: from xxxx in xxxxx where xxx select;这一种结构,注意的是,必须以from开头,select结尾
3.执行查询:在这里我们通常用到执行查询就是foreach来做,当然有for语句也可以,但后者在效率上没有前者好
eg1:
该实例是用来从一个数组中查询出所有的偶数,三个步骤的执行顺序如图所示:
创建查询和执行查询是完全不同的两个过程,在创建查询时,query变量中没有任何值,相当于只是创建,并没检索任何数据,只有在执行查询时才根据创建的查询从数据源中检索数据,也就是说只有在用foreach循环遍历时才检索数据,这种执行过程叫延迟执行,我们也可以强制立即执行,方法如下:
1.执行聚合函数(Count、Max、Average、First)
2.调用ToList(TSource>)或ToArray(TSource>)
LINQ语法:
LinQ中的查询基本语法是:from
eg1:
1.from:from后面的num表示范围变量,类似说foreach中的迭代变量,但在该查询中是不发生迭代的(因为延迟查询),只有在执行查询时num将用作对arr数据源中每一个元素的引用。arr是我们创建的数据源,要求数据源必须实现IEnumerable、IEnumerable<T>或一个派生类型Iqueryable<T>中的任何一个接口,才能使用linq语句进行查询。
复合from子句的使用:
1)在某些情况下,源序列中的每个元素本身可能是序列,也可能包含序列
2)用于访问单个数据源中的内部集合
3)使用多个from子句执行联接查询(join)
eg2:
该实例用到了复合from子句,因为在学生集合中又包含一个成绩集合,最后返回的是学生的姓名和成绩,后面的new { last = stu.LastName, score }是一个匿名类,将要获取的数据重新构建成一个类,要显示的属性做为该匿名类中新的属性。
2.where:用来指定查询的条件,与sql中类似,但语法采用C#语法。where子句不能位于查询语句的第一句和最后一句,一个查询表达式中可以包含多个where子句,一个where子句中也可以包含多个条件,多个条件之间用C#语法中的逻辑运算符连接(&&、||、!),还可以放在group子句之前或之后,主要取决于是对源数据的筛选还是对分组后的筛选,若是对源数据的筛选,则放到group之前,若是对分组后的数据的筛选则放到group之后。where子句在程序编译时将被转换成标准的Where方法被调用。
3.select:返回查询结果。
除了以上三个关键字的使用,我们还要介绍两个:orderby子句和group子句。
4.orderby:排序子句,返回升序或降序的序列。与sql语句中的排序一样,可以指定按多列进行排序,默认情况下为升序,编译时也是将orderby子句转换成OrderBy方法的调用。
eg3:
//查询成绩大于80分的学员姓名和成绩,并按成绩降序排列
注意:升序:ascending
5.group:分组查询,放回一个IGrouping(TKey,Telement)对象序列。编译时转换成GroupBy方法的调用。
eg4:
eg5:
联接查询:
使用join子句进行联接查询,要求每个不同的数据源要有一个共享某个可以进行比较以判断是否相等的值,且join子句使用特殊的equals关键字比较是否相等,不能用> < >= <=等符号,只支持对等比较联接。
联接分为:
1)内联接
eg6:
var innerjoinQuery=from category in categories
2)分组联接
eg7:
var innerGroupQuery=from category in categories
3)左外联接