ASP.NET开发大全第21章.使用LINQ查询

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第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]GOSETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO510CREATETABLE[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]GOSETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATETABLE[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创建的数据库中的数据进行数据集的填充。51121.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;iinter.Length;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=fromsininterwheres5selects;//执行LINQ查询语句foreach(vartinst)//遍历集合元素{Console.WriteLine(t.ToString());//输出数组}512Console.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{SqlConnectioncon=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;ij;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类文件用于将现有的数据抽象成对象,这样就符合了面向对象的原则,同时也能够减少代码,提513升扩展性。创建一个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同样对数据集支持查询和筛选操作。其实数据集也是集合的表现形式,数据集除了能够填充数据库中的内容以外,开发人员还能够通过对数据集的操作向数据集中添加数据和修改

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功