ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:27.37KB ,
资源ID:3270028      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3270028.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(使用LINQ处理数据.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

使用LINQ处理数据.docx

1、使用LINQ处理数据使用LINQ处理数据.NET Language-Integrated Query(LINQ,语言集成查询)是微软公司提供的一项新技术,它将查询操作直接引入到.NET Framework 3.5所支持的编程语言(如C#、Visual Basic等)中,从而直接实现查询功能。本章将讲解使用LINQ处理的方法,主要介绍以下知识点:* LINQ概述;* LINQ查询子句;* 使用LINQ维护User表的数据。通过本章的学习,读者将可以了解使用LINQ查询集合中的数据的基本操作方法,并使用LINQ处理数据库中的数据的方法。13.1 LINQ概述查询(Query)是一种从给定的数据源中

2、检索满足指定条件的数据表达式。查询也是一组指令,这些指令可以从一个或多个给定的数据源中检索数据,并指定检索结果的数据类型和表现形式。传统上,查询技术往往使用字符串来表示查询操作,如查询关系数据库的SQL语句、查询XML结构数据的XQuery等。在这些查询操作中,一般不会检查被查询数据的类型。同时,这些查询操作往往与编程语言处于一种相对孤立的状态。LINQ(.NET Language-Integrated Query、语言集成查询)也是一种查询技术,它最大的特点就是能够把查询操作直接引入到.NET Framework 3.5所支持的编程语言(如C#、Visual Basic等)中,并整合为一体。

3、LINQ查询表达式是由一组用类似于SQL或XQuery的声明性语法编写的子句组成。每一个子句可以包含一个或多个C#表达式,而这些表达式本身又可能是查询表达式或包含查询表达式。LINQ为.NET Framekwork 3.5所支持,它包括以下4个主要组件或技术。* LINQ to Objects:查询IEnumerable或IEnumerable类型的集合,即查询任何可枚举的集合,如数组(Array和ArrayList)、泛型列表(List)、字典(Dictionary),以及用户自定义的集合。* LINQ to SQL:查询和处理(如插入、修改、删除、排序等操作)基于关系数据库(如SQL Se

4、rver数据库等)的数据。* LINQ to DataSet:查询和处理DataSet对象中的数据,并这些数据进行检索、过滤和排序等操作。* LINQ to XML:查询和处理XML结构的数据(如XML文档、XML数据片段、XML格式的字符串等)。【示例13-1】 创建一个简单的LINQ查询表达式query0。该表达式查询sources数组中小于3的元素。int sources = 0,1,2,3,4,5,6,7,8,9;var query0 = from v in sources where v 3 select v;13.2 LINQ查询子句LINQ查询表达式由一组类似于SQL或XQuer

5、y的声明性语法编写的子句组成。每一个子句可以包含一个或多个C#表达式,而这些表达式本身又可能是查询表达式或包含查询表达式。LINQ查询表达式包含8个基本子句,具体说明如下所述。* from子句:指定查询表达式的数据源和范围变量。* select子句:指定筛选元素的逻辑条件。一般由逻辑运算符组成。* where子句:指定查询结果的表现形式。* group子句:对查询结果进行分组。* orderby子句:对查询结果进行排序。* join子句:用来连接多个查询操作的数据源。* let子句:可以用来引入用于存储子表达式查询结果的范围变量。* into子句:提供一个临时标识符,使用该标识可以允许对joi

6、n、group或select子句结果的引用。13.2.1 from子句from子句和SQL语句中的“FROM子句”比较相似,它可以指定查询的数据源(也包括子查询的数据源)和范围变量。其中,范围变量用来表示数据源序列中的每一个元素。?注意:LINQ查询表达式必须包含from子句,且以from子句开头。【示例13-2】 创建了一个LINQ查询表达式,并保存为query1。该表达式从sources数组中查询小于2的元素。?注意:s为范围变量。sources为数据源,它为整型数组,并包含10个值。int sources = 0,1,2,3,4,5,6,7,8,9;var query1 = from s

7、 in sources where s 2 select s;示例13-2的查询结果如表13.1所示。表13.1 示例13-2的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)from s in sourceswhere s 2select s;query1(包含两个元素,分别为0和1)【示例13-3】 创建了一个LINQ查询表达式,并保存为query2。该表达式从strs字符串中查询a字符到g之间的字符。?注意:c为范围变量。strs为数据源,它为一个字符串,值为“This is a string.”。string st

8、rs = This is a string.;var query2 = from c in strs where c = a select c;示例13-3的查询结果如表13.2所示。表13.2 示例13-3的查询结果表数 据 源查询表达式查 询 结 果strs,值为“This is a string.”from c in strswhere c = aselect c;query2(包含两个元素,分别为“a”和“g”)?注意:from子句指定数据源的类型必须为IEnumerable、IEnumerable或前两者的派生类型。根据from子句的数量和组合方式,可以把LINQ查询表达式分为以下3

9、种类型。* 单个from子句查询表达式。* 多个from子句查询表达式。* 复合from子句查询表达式。1单个from子句查询若LINQ查询表达式只包含一个from子句,则称该查询为单个from子句查询。一般情况下,单个from子句查询往往使用一个数据源。【示例13-4】 创建了一个LINQ查询表达式,并保存为query3。该表达式从strs字符串中查询a字符到c之间的字符。string strs = This is a string.;var query3 = from c in strs where c = a select c;示例13-4的查询结果如表13.3所示。表13.3 示例13

10、-4的查询结果表数 据 源查询表达式查 询 结 果strs,值为“This is a string.”from c in strswhere c = aselect c;query3(包含1个元素,为“a”)2多个from子句查询若LINQ查询表达式包含多个from子句,则称该查询为多个from子句查询。一般情况下,包含多个from子句的查询往往使用多个数据源。【示例13-5】 创建了一个LINQ查询表达式,并保存为query4。该表达式从sourcesa数组中查询小于2的元素,并从sourcesb数组中查询大于100的元素,并计算两个查询的和。int sourcesa = 0,1,2,3,4

11、,5,6,7,8,9;int sourcesb = 100,200,300,400,2008;var query4 = from s in sourcesa where s 100 select s + i;示例13-5的查询结果如表13.4所示。表13.4 示例13-5的查询结果表数 据 源查询表达式查 询 结 果sourcesa(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)sourcesb(包括5个元素,分别为100、200、300、400、2008)from s in sourcesawhere s 100select s + i;query4(包含8个元素,分别为200

12、、300、400、2008、201、301、401、2009)3复合from子句查询在一些情况下,数据源的元素也是一个数据源(被称为子数据源)。如果要查询子数据源中的元素,则需要使用复合from子句。【示例13-6】 创建了一个LINQ查询表达式,并保存为query5。该表达式首先从sources字符数组中查询包含string的字符串(使用“from s in sources”子句),然后从该字符串中查询a字符到g之间的字符(使用“from c in s”子句)。最后,输出查询结果的字符及其所在的字符串。string sources = This is a string.,This is a

13、book.;var query5 = from s in sources from c in s where s.IndexOf(string) -1 & c = a select c + : + s;示例13-6的查询结果如表13.5所示。表13.5 示例13-6的查询结果表数 据 源查询表达式查 询 结 果sources(包含2个元素,分别为“This is a string.”和“This is a book.”)from s in sourcesfrom c in swhere s.IndexOf(string) -1 & c = aselect c + : + s;query5(包含

14、2个元素,分别为“a:This is a string.”和“g:This is a string.”)13.2.2 where子句where子句和SQL语句中的“WHERE子句”比较相似,它指定查询表达式的筛选元素满足的逻辑条件。where子句一般由逻辑运算符(如逻辑“与”、逻辑“或”)组成。一个查询表达式可以包含1个或多个where子句,甚至不包含where子句。每一个where子句可以包含1个或多个布尔条件表达式。?注意:对LINQ查询表达式而言,where子句不是必须的。如果LINQ查询表达式包含了where子句,那么where子句不能为LINQ查询表达式的第一个子句或最后一个 子句。

15、【示例13-7】 创建了一个LINQ查询表达式,并保存为query6。该表达式从sources数组中查询大于3的元素。int sources = 0,1,2,3,4,5,6,7,8,9;var query6 = from s in sources where s 3 select s;示例13-7的查询结果如表13.6所示。表13.6 示例13-7的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9) from s in sources where s 3 select s;query6(包含6个元素,分别为4、5、6、7、8

16、、9)【示例13-8】 创建了一个LINQ查询表达式,并保存为query7。该表达式从sources数组中查询大于3且小于8的元素。int sources = 0,1,2,3,4,5,6,7,8,9;var query7 = from s in sources where s 3 & s 3 & 7 select s;示例13-9的查询结果如表13.8所示。表13.8 示例13-9的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)from s in sourceswhere s 7select s;query8(包含2个元

17、素,分别为8和9)【示例13-10】 创建了一个LINQ查询表达式,并保存为query9。该表达式从sources数组中查询小于3的元素,并返回查询结果的元素与100的乘积。int sources = 0,1,2,3,4,5,6,7,8,9;var query9 = from s in sources where s 3 select s * 100;示例13-10的查询结果如表13.9所示。表13.9 示例13-10的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)from s in sourceswhere s 3se

18、lect s * 100;query8(包含3个元素,分别为0、100、200)【示例13-11】 创建了一个LINQ查询表达式,并保存为query10。该表达式从sources数组中查询小于3的元素,并返回新对象。其中,新对象的ID属性值为查询结果的元素值;Username属性的值则由“User”字符串和查询结果的元素的值组成。int sources = 0,1,2,3,4,5,6,7,8,9;var query10 = from s in sources where s 3 select new ID = s, Username = User + s.ToString() ;示例13-11

19、的查询结果如表13.10所示。表13.10 示例13-11的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)from s in sourceswhere s 3select new UserInfoID = s,Username = User + s.ToString();query10(包含3个元素,元素的ID属性的值分别为0、1、2)13.2.4 group子句group子句可以对查询的结果进行分组,并返回元素类型为IGrouping的对象序列。其中,TKey参数指定元素的键的类型,TElement参数指定元素的值的类

20、型。?注意:IGrouping和IEnumerable非常相似,在此不做详细介绍。【示例13-12】 创建了一个LINQ查询表达式,并保存为query11。该表达式从sources数组中查询元素,并按照元素的奇偶性进行分组。int sources = 0,1,2,3,4,5,6,7,8,9;var query11 = from s in sources group s by s % 2 = 0;【示例13-13】 使用2个foreach语句输出了query11查询的结果。第1个foreach语句枚举query11查询结果中的所有的组,第2个foreach语句枚举每一个组中的每一个元素。fore

21、ach(var q in query11) foreach(var subq in q) Response.Write(subq.ToString() + ,); Response.Write();13.2.5 orderby子句orderby子句可以按照关键字(或键)对查询结果进行排序,其中,排序方式可以为“升序”或“降序”,排序的关键字(或键)可以为一个或多个。?注意:order子句的默认排序方式为“升序”。【示例13-14】 创建了一个LINQ查询表达式,并保存为query12。该表达式从sources数组中查询大于7的元素,并按照元素进行升序排序。int sources = 0,1,2

22、,3,4,5,6,7,8,9;var query12 = from s in sources where s 7 order by s select s;示例13-14的查询结果如表13.11所示。表13.11 示例13-14的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)from s in sourceswhere s 7order by sselect s;query12(包含2个元素,分别为8和9)【示例13-15】 创建了一个LINQ查询表达式,并保存为query13。该表达式从sources数组中查询元素,并按

23、照元素的奇偶性进行分组。其中,每一个分组都按照元素的值进行倒序排序。int sources = 0,1,2,3,4,5,6,7,8,9;var query13 = from s in sources orderby s descending group s by s % 2 = 0;13.2.6 into子句into子句可以创建一个临时标识符,使用该标识符可以存储group、join或select子句查询结果。【示例13-16】 创建了一个LINQ查询表达式,并保存为query14。该查询表达式的具体操作说明如下所述。* 从sources数组中查询元素。* 按照元素的奇偶性进行分组。* 每一个

24、分组中的元素都按照元素的值进行倒序排序。* 将每一个查询结果临时保存为g变量。* 使用where子句判断查询g变量中的元素数量是否大于5,如果大于5,则选择该组。int sources = 0,1,2,3,4,5,6,7,8,9,10;var query14 = from s in sources orderby s descending group s by s % 2 = 0 into g where g.Count() 5 select g;示例13-16的查询结果如表13.12所示。表13.12 示例13-16的查询结果表数 据 源查询表达式查 询 结 果sources(包含10个元素

25、,分别为0、1、2、3、4、5、6、7、8、9、10)from s in sourcesorderby s descendinggroup s by s % 2 = 0 into gwhere g.Count() 5select g;query14(包含1个元素,该元素为一个组,组内包含6个元素,分别为10、8、6、4、2、0)13.2.7 let子句let子句可以创建一个范围变量,使用该变量可以保存表达式中的中间结果。?注意:let子句创建的范围变量的值只能通过初始化操作进行赋值。范围变量的值一旦被初始化,将不能再被改变。【示例13-17】 创建了一个LINQ查询表达式,并保存为query1

26、5。该查询表达式的具体操作说明如下所述。* 从sources数组中查询元素。* 使用let语句创建范围变量m,它的值为元素除以2的余数。* 查询元素的值大于3,且m变量的值等于1的元素。int sources = 0,1,2,3,4,5,6,7,8,9;var query15 = from s in sources let m = s % 2 where s 3 & m = 1 select s;示例13-17的查询结果如表13.13所示。表13.13 示例13-17的查询结果表数 据 源查询表达式查 询 结 果sources(包含9个元素,分别为0、1、2、3、4、5、6、7、8、9)fro

27、m s in sourceslet m = s % 2where s 3 & m = 1select s;query15(包含3个元素,分别为5、7和9)13.2.8 join子句join子句可以设置两个或多个存在相关属性或值的数据源之间的关系。join子句可以为数据源之间建立以下3种联接关系。* 内部联接,和SQL语句中的“INNER JOIN子句”比较相似,两个数据源都必须存在相同的值,即两个数据源都必须存在满足联接关系的元素。* 分组联接,即为含有into子句的join子句。* 左外部联接,和SQL语句中的“INNER LEFT子句”比较相似。【示例13-18】 创建两个类:UserInfo和Role- Info。UserInfo类描述用户的信息,包含3个属性:ID、RoleID和Username。RoleInfo类描述角色的信息,包含2个属性:ID和RoleName。UserInfo和RoleInfo类的类关系图如图13.1所示。?注意:UserInfo类的RoleID属性的值是引用于RoleInfo类的ID属性。因此,UserInfo类的RoleID属性和RoleInfo类的ID属性将建立联接关系。/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1