ASPNET35开发大全第21章.docx
- 文档编号:30119811
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:55
- 大小:450.60KB
ASPNET35开发大全第21章.docx
《ASPNET35开发大全第21章.docx》由会员分享,可在线阅读,更多相关《ASPNET35开发大全第21章.docx(55页珍藏版)》请在冰豆网上搜索。
ASPNET35开发大全第21章
第21章使用LINQ查询
了解了基本的LINQ基本概念,以及Lambda表达式基础后,就能够使用LINQ进行应用程序开发。
LINQ使用了Lambda表达式,以及底层接口实现了对集合的访问和查询,开发人员能够使用LINQ对不同的对象,包括数据库、数据集和XML文档进行查询。
21.1LINQ查询概述
LINQ可以对多种数据源和对象进行查询,如数据库、数据集、XML文档甚至是数组,这在传统的查询语句中是很难实现的。
如果有一个集合类型的值需要进行查询,则必须使用Where等方法进行遍历,而使用LINQ可以仿真SQL语句的形式进行查询,极大的降低了难度。
21.1.1准备数据源
既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使用LINQ进行数据查询时首先需要准备数据源。
1.数组
数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。
数组数据源示例代码如下所示。
string[]str={"学习","学习LINQ","好好学习","生活很美好"};
int[]inter={1,2,3,4,5,6,7,8,9};
数组可以看成是一个集合,虽然数组没有集合的一些特性,但是从另一个角度上来说可以看成是一个集合。
在传统的开发过程中,如果要筛选其中包含“学习”字段的某个字符串,则需要遍历整个数组。
2.SQLServer
在数据库操作中,同样可以使用LINQ进行数据库查询。
LINQ以其优雅的语法和面向对象的思想能够方便的进行数据库操作,为了使用LINQ进行SQLServer数据库查询,可以创建两个表,这两个表的结构如下所示。
Student(学生表):
❑S_ID:
学生ID。
❑S_NAME:
学生姓名。
❑S_CLASS:
学生班级。
❑C_ID:
所在班级的ID。
上述结构描述了一个学生表,可以使用SQL语句创建学生表,示例代码如下所示。
USE[student]
GO
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATETABLE[dbo].[Student](
[S_ID][int]IDENTITY(1,1)NOTNULL,
[S_NAME][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[S_CLASS][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[C_ID][int]NULL,
CONSTRAINT[PK_Student]PRIMARYKEYCLUSTERED
(
[S_ID]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,
ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
为了更加详细的描述一个学生所有的基本信息,就需要创建另一个表对该学生所在的班级进行描述,班级表结构如下所示。
Class(班级表):
❑C_ID:
班级ID。
❑C_GREAD:
班级所在的年级。
❑C_INFOR:
班级专业。
上述代码描述了一个班级的基本信息,同样可以使用SQL语句创建班级表,示例代码如下所示。
USE[student]
GO
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATETABLE[dbo].[Class](
[C_ID][int]IDENTITY(1,1)NOTNULL,
[C_GREAD][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
[C_INFOR][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
CONSTRAINT[PK_Class]PRIMARYKEYCLUSTERED
(
[C_ID]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,
ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
上述代码在Student数据库中创建了一个班级表,开发人员能够向数据库中添加相应的信息以准备数据源。
3.数据集
LINQ能够通过查询数据集进行数据的访问和整合;通过访问数据集,LINQ能够返回一个集合变量;通过遍历集合变量可以进行其中数据的访问和筛选。
在第9章中讲到了数据集的概念,开发人员能够将数据库中的内容填充到数据集中,也可以自行创建数据集。
数据集是一个存在于内存的对象,该对象能够模拟数据库的一些基本功能,可以模拟小型的数据库系统,开发人员能够使用数据集对象在内存中创建表,以及模拟表与表之间的关系。
在数据集的数据检索过程中,往往需要大量的if、else等判断才能检索相应的数据。
使用LINQ进行数据集中数据的整理和检索可以减少代码量并优化检索操作。
数据集可以是开发人员自己创建的数据集也可以是现有数据库填充的数据集,这里使用上述SQLServer创建的数据库中的数据进行数据集的填充。
21.1.2使用LINQ
在传统对象查询中,往往需要很多的if、else语句进行数组或对象的遍历,例如在数组中寻找相应的字段,实现起来往往比较复杂,而使用LINQ就简化了对象的查询。
由于前面已经准备好了数据源,那么就能够分别使用LINQ语句进行数据源查询。
1.数组
在前面的章节中,已经创建了一个数组作为数据源,数组示例代码如下所示。
int[]inter={1,2,3,4,5,6,7,8,9};
上述代码是一个数组数据源,如果开发人员需要从其中的元素中搜索大于5的数字,传统的方法应该遍历整个数组并判断该数字是否大于5,如果大于5则输出,否则不输出,示例代码如下所示。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;//使用必要的命名空间
usingSystem.Text;
namespace_21_1
{
classProgram
{
staticvoidMain(string[]args)
{
string[]str={"学习","学习LINQ","好好学习","生活很美好"};//定义数组
int[]inter={1,2,3,4,5,6,7,8,9};
for(inti=0;i { if(inter[i]>5)//判断数组元素的值是否大于5 { Console.WriteLine(inter[i].ToString());//输出对象 } } Console.ReadKey(); } } } 上述代码非常简单,将数组从头开始遍历,遍历中将数组中的的值与5相比较,如果大于5就会输出该值,如果小于5就不会输出该值。 虽然上述代码实现了功能的要求,但是这样编写的代码繁冗复杂,也不具有扩展性。 如果使用LINQ查询语句进行查询就非常简单,示例代码如下所示。 classProgram { staticvoidMain(string[]args) { string[]str={"学习","学习LINQ","好好学习","生活很美好"};//定义数组 int[]inter={1,2,3,4,5,6,7,8,9};//定义数组 varst=fromsininterwheres>5selects;//执行LINQ查询语句 foreach(vartinst)//遍历集合元素 { Console.WriteLine(t.ToString());//输出数组 } Console.ReadKey(); } } 使用LINQ进行查询之后会返回一个IEnumerable的集合。 在上一章讲过,IEnumerable是.NET框架中最基本的集合访问器,可以使用foreach语句遍历集合元素。 使用LINQ查询数组更加容易被阅读,LINQ查询语句的结构和SQL语法十分类似,LINQ不仅能够查询数组,还可以通过.NET提供的编程语言进行筛选。 例如str数组变量,如果要查询其中包含“学习”的字符串,对于传统的编程方法是非常冗余和繁琐的。 由于LINQ是.NET编程语言中的一部分,开发人员就能通过编程语言进行筛选,LINQ查询语句示例代码如下所示。 varst=fromsinstrwheres.Contains("学习")selects; 2.使用SQLServer 在传统的数据库开发中,如果需要筛选某个数据库中的数据,可以通过SQL语句进行筛选。 在ADO.NET中,首先需要从数据库中查询数据,查询后就必须将数据填充到数据集中,然后在数据集中进行数据遍历,示例代码如下所示。 try { SqlConnection con=newSqlConnection("server='(local)';database='student';uid='sa';pwd='sa'");//创建连接 con.Open();//打开连接 stringstrsql="select*fromstudent,classwherestudent.c_id=class.c_id";//SQL语句 SqlDataAdapterda=newSqlDataAdapter(strsql,con);//创建适配器 DataSetds=newDataSet();//创建数据集 intj=da.Fill(ds,"mytable");//填充数据集 for(inti=0;i { Console.WriteLine(ds.Tables["mytable"].Rows[i]["S_NAME"].ToString());//输出对象 } } catch { Console.WriteLine("数据库连接错误");//抛出异常 } 上述代码进行数据库的访问和查询。 在上述代码中,首先需要创建一个连接对象进行数据库连接,然后再打开连接,打开连接之后就要编写SELECT语句进行数据库查询并填充到DataSet数据集中,并在DataSet数据集中遍历相应的表和列进行数据筛选。 如果要查询C_ID为1的学生的所有姓名,有三个办法,这三个办法分别是: ❑修改SQL语句。 ❑在循环内进行判断。 ❑使用LINQ进行查询。 修改SQL语句是最方便的方法,直接在SELECT语句中添加查询条件WHEREC-ID=1就能够实现,但是这个方法扩展性非常的低,如果有其他需求则就需要修改SQL语句,也有可能造成其余代码填充数据集后数据集内容不同步。 在循环内进行判断也是一种方法,但是这个方法当循环增加时会造成额外的性能消耗,并且当需要扩展时,还需要修改循环代码。 最方便的就是使用LINQ进行查询,在VisualStudio2008中提供了LINQtoSQL类文件用于将现有的数据抽象成对象,这样就符合了面向对象的原则,同时也能够减少代码,提升扩展性。 创建一个LINQtoSQL类文件,直接将服务资源管理器中的相应表拖放到LINQtoSQL类文件可视化窗口中即可,如图21-1所示。 图21-1创建LINQtoSQL文件 创建了LINQtoSQL类文件后,就可以直接使用LINQtoSQL类文件提供的类进行查询,示例代码如下所示。 linqtosqlDataContextlq=newlinqtosqlDataContext(); varmylq=fromlinlq.Studentfromclinlq.Classwherel.C_ID==cl.C_IDselectl;//执行查询 foreach(varresultinmylq)//遍历集合 { Console.WriteLine(result.S_NAME.ToString());//输出对象 } 上述代码只用了很短的代码就能够实现数据库中数据的查询和遍历,并且从可读性上来说也很容易理解,因为LINQ查询语句的语法基本与SQL语法相同,只要有一定的SQL语句基础就能够非常容易的编写LINQ查询语句。 3.数据集 LINQ同样对数据集支持查询和筛选操作。 其实数据集也是集合的表现形式,数据集除了能够填充数据库中的内容以外,开发人员还能够通过对数据集的操作向数据集中添加数据和修改数据。 前面的章节中已经讲到,数据集可以看作是内存中的数据库。 数据集能够模拟基本的数据库,包括表、关系等。 这里就将SQLServer中的数据填充到数据集即可,示例代码如下所示。 try { SqlConnection con=newSqlConnection("server='(local)';database='student';uid='sa';pwd='sa'");//创建连接 con.Open();//打开连接 stringstrsql="select*fromstudent,classwherestudent.c_id=class.c_id";//执行SQL SqlDataAdapterda=newSqlDataAdapter(strsql,con);//创建适配器 DataSetds=newDataSet();//创建数据集 da.Fill(ds,"mytable");//填充数据集 DataTabletables=ds.Tables["mytable"];//创建表 vardslq=fromdintables.AsEnumerable()selectd;//执行LINQ语句 foreach(varresindslq) { Console.WriteLine(res.Field } } catch { Console.WriteLine("数据库连接错误"); } 上述代码使用LINQ针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。 在使用LINQ进行数据集操作时,LINQ不能直接从数据集对象中查询,因为数据集对象不支持LINQ查询,所以需要使用AsEnumerable方法返回一个泛型的对象以支持LINQ的查询操作,示例代码如下所示。 vardslq=fromdintables.AsEnumerable()selectd;//使用AsEnumerable 上述代码使用AsEnumerable方法就可以让数据集中的表对象能够支持LINQ查询。 21.1.3执行LINQ查询 从上一节可以看出LINQ在编程过程中极大的方便了开发人员对于业务逻辑的处理代码的编写,在传统的编程方法中复杂、冗余、难以实现的方法在LINQ中都能很好的解决。 LINQ不仅能够像SQL语句一样编写查询表达式,LINQ最大的优点也包括LINQ作为编程语言的一部分,可以使用编程语言提供的特性进行LINQ条件语句的编写,这就弥补了SQL语句中的一些不足。 在前面的章节中将一些复杂的查询和判断的代码简化成LINQ应用后,就能够执行应用程序判断LINQ是否查询和筛选出了所需要的值。 1.数组 在数组数据源中,开发人员希望能够筛选出大于5的元素。 开发人员将传统的代码修改成LINQ代码并通过LINQ查询语句进行筛选,示例代码如下所示。 varst=fromsininterwheres>5selects;//执行LINQ查询 上述代码将查询在inter数组中的所有元素并返回其中元素的值大于5的元素的集合,运行后如图21-2所示。 图21-2遍历数组 LINQ执行了条件语句并返回了元素的值大于5的元素。 LINQ语句能够方便的扩展,当有不同的需求时,可以修改条件语句进行逻辑判断,例如可以筛选一个平方数为偶数的数组元素,直接修改条件即可,LINQ查询语句如下所示。 varst=fromsininterwhere(s*s)%2==0selects;//执行LINQ查询 上述代码通过条件(s*s)%2==0将数组元素进行筛选,选择平方数为偶数的数组元素的集合,运行后如图21-3所示。 图21-3更改筛选条件 2.使用SQLServer 在LINQtoSQL类文件中,LINQtoSQL类文件已经将数据库的模型封装成一个对象,开发人员能够通过面向对象的思想访问和整合数据库。 LINQtoSQL也对SQL做了补充,使用LINQtoSQL类文件能够执行更强大的筛选,LINQ查询语句代码如下所示。 varmylq=fromlinlq.Studentfromclinlq.Classwherel.C_ID==cl.C_IDselectl;//执行LINQ查询 上述代码从Student表和Class表中筛选了C_ID相等的学生信息,这很容易在SQL语句中实现。 LINQ作为编程语言的一部分,可以使用更多的编程方法实现不同的筛选需求,例如筛选名称中包含“郭”字的学生的名称在传统的SQL语句中就很难通过一条语句实现,而在LINQ中就能够实现,示例代码如下所示。 varmylq=fromlinlq.Studentfromclinlq.Classwherel.C_ID==cl.C_IDwhere l.S_NAME.Contains("郭")selectl;//执行LINQ条件查询 上述代码使用了Contains方法判断一个字符串中是否包含某个字符或字符串,这样不仅方便阅读,也简化了查询操作,运行后如图21-4和图21-5所示。 图21-4简单查询图21-5条件查询 LINQ返回了符合条件的元素的集合,并实现了筛选操作。 LINQ不仅作为编程语言的一部分,简化了开发人员的开发操作,从另一方面讲,LINQ也补充了在SQL中难以通过几条语句实现的功能的实现。 从上面的LINQ查询代码可以看出,就算是不同的对象、不同的数据源,其LINQ基本的查询语法都非常相似,并且LINQ还能够支持编程语言具有的特性从而弥补SQL语句的不足。 在数据集的查询中,其查询语句也可以直接使用而无需大面积修改代码,这样代码就具有了更高的维护性和可读性。 21.2LINQ查询语法概述 从上面的章节中可以看出,LINQ查询语句能够将复杂的查询应用简化成一个简单的查询语句,不仅如此,LINQ还支持编程语言本有的特性进行高效的数据访问和筛选。 虽然LINQ在写法上和SQL语句十分相似,但是LINQ语句在其查询语法上和SQL语句还是有出入的,SQL查询语句如下所示。 select*fromstudent,classwherestudent.c_id=class.c_id//SQL查询语句 上述代码是SQL查询语句,对于LINQ而言,其查询语句格式如下所示。 varmylq=fromlinlq.Studentfromclinlq.Classwherel.C_ID==cl.C_IDselectl;//LINQ查询语句 上述代码作为LINQ查询语句实现了同SQL查询语句一样的效果,但是LINQ查询语句在格式上与SQL语句不同,LINQ的基本格式如下所示。 var<变量>=from<项目>in<数据源>where<表达式>orderby<表达式> LINQ语句不仅能够支持对数据源的查询和筛选,同SQL语句一样,还支持ORDERBY等排序,以及投影等操作,示例查询语句如下所示。 varst=fromsininterwheres==3selects;//LINQ查询 varst=fromsininterwhere(s*s)%2==0orderbysdescendingselects;//LINQ条件查询 从结构上来看,LINQ查询语句同SQL查询语句中比较大的区别就在于SQL查询语句中的SELECT关键字在语句的前面,而在LINQ查询语句中SELECT关键字在语句的后面,在其他地方没有太大的区别,对于熟悉SQL查询语句的人来说非常容易上手。 21.3基本子句 既然LINQ查询语句同SQL查询语句一样,能够执行条件、排序等操作,这些操作就需要使用WHERE、ORDERBY等关键字,这些关键字在LINQ中是基本子句。 同SQL查询语句中的WHERE、ORDERBY操作一样,都为元素进行整合和筛选。 21.3.1from查询子句 from子句是LINQ查询语句中最基本也是最关键的子句关键字,与SQL查询语句不同的是,from关键字必须在LINQ查询语句的开始。 1.from查询子句基础 后面跟随着项目名称和数据源,示例代码如下所示。 varlinqstr=fromlqinstrselectlq;//form子句 from语句指定项目名称和数据源,并且指定需要查询的内容,其中项目名称作为数据源的一部分而存在,用于表示和描述数据源中的每个元素,而数据源可以是数组、集合、数据库甚至是XML。 值得一提的是,from子句的数据源的类型必须为IEnumerable、IEnumerable 在.NETFramework中泛型编程中,List(可通过索引的强类型列表)也能够支持LINQ查询语句的from关键字,因为List实现了IEnumerable、IEnumerable
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASPNET35 开发 大全 21