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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(ASP.NET开发大全第20章.ASP.NET-3.5与LINQ.doc)为本站上传会员【a199****6536】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

ASP.NET开发大全第20章.ASP.NET-3.5与LINQ.doc

1、 第20章 ASP.NET 3.5与LINQ 对于长期发展的面向对象编程模型而言,其发展基本处于一个比较稳定的阶段,可是面向对象的编程模型并没有解决数据的访问和整合的复杂问题。对于数据库的访问和XML的访问,面向对象方法论无法从根本意义上解决其复杂度和难度,而LINQ提供了一种更好的解决方案。 20.1 什么是LINQ 任何技术都不可能凭空搭建起来,为了解决工业生产生中某个实际问题,当现有的技术已经无法很好的完成工业的要求,就会促发新技术的诞生。LINQ就是为了解决复杂的数据访问和整合而出现的一种新技术。 20.1.1 LINQ起源 从传统的意义上来说,面向过程的编程模型在数

2、据访问和整合的能力上有一定的限度。因为面向过程的编程方法不能很好的描述一个事务,必须通过不同函数之间的调用来描述一个现有的对象,而且面向过程的编程方法在代码复用性上比较低,所以当面向过程的编程语言需要对数据库进行访问时,就需要编写大量的额外代码。虽然面向过程的编程模型可以通过良好的函数引用和编码提高复用性,但是并没有解决面向过程编程模型中对数据的访问和整合的复杂度。 随着计算机和编程模型的发展,人们发现了另一个更好的编程模型,这就是现在最常用的面向对象编程模型。相比面向过程的编程模型而言,面向对象的编程模型能够更好的描述一个事务,事务能够通过面向对象中的属性、字段和方法很好的模拟实际的事务,

3、而面向对象编程模型中的派生、继承等特性同样能够极大的提高代码的复用性,提升开发效率。 但是面向对象的编程模型同样没有解决复杂的数据库访问和数据整合,开发人员还是需要通过繁琐的手段进行数据库的访问和数据整合。在.NET 3.0框架或更早,LINQ就已经被提及,LINQ是一种能够快速对大部分数据源进行访问和数据整合的一种技术,LINQ解决了复杂的数据应用中开发人员需要面对和解决的问题。 虽然面向对象的数据库已经在几年前就被提及并且各大IT公司投入了对面向对象的数据库的研发,但是传统的关系型数据库在当今还是应用最为广泛的。关系型数据库中将数据整合和呈现成为一张张的表的形式,开发人员和数据库管理人

4、员能够通过SQL管理工具提供的SQL语句进行数据的查询和整理。但是在开发过程中,开发人员不能够像使用SQL语句一样对数据集进行查询和处理。任何数据库中的数据都会以一种数据集的形式反馈给用户,这种数据集的形式可以反映成为数学中的集合的概念,其实在数据库早期的发展中,数据是以集合的概念呈现的,而随着数据库的发展,集合的概念依旧是数据库最基本的概念。 正式因为如此,开发人员不能够方便的是从一个集合中查询数据,这里不仅仅是一个数据库,还包括其他能够以数据库形式存在的文件,例如ACCESS、TXT等,当在开发中需要使用到多个数据库或者数据描述形式的文件时,更多的情况是将这些数据填充到数据集中并通过遍历

5、来访问数据,这样却造成了更多的数据访问问题和麻烦。 LINQ能够很方便的进行数据的查询,使用LINQ对数据集进行查询的形式很像使用SQL语句对数据库中的表进行查询,而与之不同的是,LINQ能够面向更多的对象,这些对象包括数组、集合以及数据库,LINQ对数组的查询示例代码如下所示。 static void Main(string[] args) { string[] str = { "你好","今天的","天气真不错","生活很阳光"}; //创建数组 var s = from n in str s

6、elect n; //编写查询字串 foreach (var n in s) //遍历查询对象 { Console.WriteLine(n.ToString()); //输出对象值 } Console.ReadKey(); //等待用户按键 } 上述代码对数组str进行了查询,这种方式很像SQL语句。的确LINQ的查询方式和SQL语句很像,其语法和基本内容都没

7、有什么太大的差别,但是LINQ提供了更好的查询的解决方案。LINQ能够查询更多对象(例如上述代码中的数组)而无法使用SQL语句进行查询。另外,LINQ查询语句还能够使用WHERE等关键字进行查询,示例代码如下所示。 static void Main(string[] args) { string[] str = { "你好","今天的","天气真不错","生活很阳光"}; //创建数组 var s = from n in str where n.Length > 3 select n;

8、//使用条件查询 foreach (var n in s) //遍历查询对象 { Console.WriteLine(n.ToString()); //输出对象值 } Console.ReadKey(); //等待用户按键 } 上述代码修改了LINQ查询语句,为LINQ查询语句增加了条件查询,该条件的意义为查询字符串长度大于3的字符串,运行后如图20-1所示。 图20-1

9、 LINQ查询语句 从上图可以看出,能够使用类似于SQL语句的形式进行数据集的查询,很大程度上方便了开发人员对于数据库中数据的访问和整理。LINQ可以使用条件语句进行筛选,并且能够使用.NET提供的语法进行判断,这样就简化了开发人员对于数据集中的数据的筛选。有关LINQ的语句,会在后面的章节中详细的讲解。 20.1.2 LINQ构架 在.NET 3.5中,LINQ(Language Integrated Query)已经成为了编程语言的一部分,开发人员已经能够使用Visual Studio 2008创建使用LINQ的应用程序。LINQ对基于.NET平台的编程语言提供了标准的查询操作。在

10、NET 3.5中,LINQ的基本构架如图20-2所示。 图20-2 LINQ基本构架 如图20-2所示,LINQ能够对不同的对象进行查询。在.NET 3.5中,微软提供了不同的命名空间以支持不同的数据库配合LINQ进行数据查询。在LINQ框架中,处于最上方的就是LINQ应用程序,LINQ应用程序基于.NET框架而存在的,LINQ能够支持C#、VB等.NET平台下的宿主语言进行LINQ查询。在LINQ框架中,还包括Linq Enabled ADO.NET层,该层提供了LINQ查询操作并能够提供数据访问和整合功能。 LINQ包括五个部分,这五个部分分别是LINQ to Objects

11、LINQ to DataSet、LINQ to SQL、LINQ to Entities、LINQ to XML,在.NET开发中最常用的是LINQ to SQL和LINQ to XML,本书也详细介绍LINQ的这两个部分。 LINQ to SQL提供了对SQL Server中数据库的访问和整合功能,同时能够以对象的形式进行数据库管理,前面已经提到,现在的数据库依旧以关系型数据库为主,在面向对象开发过程中,很难通过对象的方法描述数据库,而LINQ提供了通过对象的形式对数据库进行描述。LINQ to XML提供了对XML中数据集的访问和整合功能,LINQ to XML使用System.Xml

12、Linq命名控件,为XML操作提供了高效易用的方法。 20.1.3 LINQ与Visual Studio 2008 新特性 讲到LINQ就不得不讲解Visual Studio 2008的新特性,LINQ作为Visual Studio 2008中的一部分,Visual Studio 2008为LINQ提供很好的编程环境,LINQ也使用到了C#编程语言中的很多特性,以提高开发人员的开发效率。 q Visual Studio 2008重定向:使用Visual Studio 2008与Visual Studio 2005不同的是,Visual Studio 2008支持多个版本.NET框架的

13、共存,在Visual Studio 2008中可以选择基于.NET 2.0或.NET 3.X版本的框架来开发不同的应用程序,当选择不同的应用程序基础框架时,Visual Studio 2008能够智能的提供不同的命名空间。 q Visual Studio 2008 AJAX:在ASP.NET 2.0开发中,需要使用ASP.NET AJAX 1.0作为AJAX开发必备的工具,在Visual Studio 2008中已经集成了对AJAX的支持,创建ASP.NET 3.5应用程序已经能够非常方便的使用AJAX功能。 q Visual Studio 2008 可视化操作:在Visual Studi

14、o 2008中,微软提供了可视化操作,开发人员能够选择不同的视图进行页面分离形式的开发,在Visual Studio 2008中开发人员可以选择视图,拆分,代码三种视图进行不同的开发体验。 q Visual Studio 2008集成LINQ:这是Visual Studio 2008中比较值得期待的功能,Visual Studio 2008将LINQ作为编程语言中的一部分,为开发人员提供了LINQ开发的原生环境。 在LINQ与Visual Studio 2008中,开发人员最为期待的新特性还是Visual Studio 2008对LINQ的原生支持,使用LINQ能够快速的进行数据库的访问和

15、整合,这样在一定的意义上降低了开发难度,LINQ在.NET Framework 3.5中的位置如图20-3所示。 图20-3 .NET框架中的LINQ 正如图20-3所示,.NET 2.0后面几个版本的框架都是基于.NET Framework 2.0而存在的,在.NET Framework 3.0中,微软已经增加了WPF,WCF,WF等新特性以提供快速的面向服务的开发和完善的用户体验解决方案。而LINQ是作为.NET Framework 3.5存在于.NET Framework中的,这也就是说只有在.NET Framework 3.5框架中才能够使用LINQ技术。由于.NET Fra

16、mework 3.5版本的框架基于.NET Framework 3.0版本,开发人员可以使用LINQ特性进行分布式开发和面向服务的开发,这样就能够更近一步的提高代码的复用性和安全性。 20.2 LINQ与Web应用程序 在ASP.NET应用程序开发中,常常需要涉及到数据的显式和整合,使用ASP.NET 2.0中提供的控件能够编写用户控件,开发人员还能够选择开发自定义控件进行数据显示和整合,但是在数据显示和整合过程中,开发人员往往需要大量的连接、关闭连接等操作,而且传统的方法也破坏了面向对象的特性,使用LINQ能够方便的使用面向对象的方法进行数据库操作。 20.2.1 创建使用LINQ

17、的Web应用程序 创建LINQ的Web应用程序非常的容易,只要创建Web应用程序时选择的平台是基于.NET Framework 3.5的就能够创建使用LINQ的Web应用程序,如图20-4所示。 图20-4 选择.NET Framework 3.5 当创建一个基于系统.NET Framework 3.5的应用程序,系统就能够自动为应用程序创建LINQ所需要的命名空间,示例代码如下所示。 using System.Xml.Linq; //使用LINQ命名空间 using System.Linq; //使用LINQ命名空间 上述

18、命名空间提供了应用程序中使用LINQ所需要的基础类和枚举,在ASP.NET应用程序中就能够使用LINQ查询语句进行查询,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) { string[] str = { "我爱C#", "我喜欢C#", "我做C#开发", "基于.NET平台", "LINQ应用" }; //数据集 var s = from n in str where n.Contains("C#") select n;

19、 //执行LINQ查询 foreach (var t in s) //遍历对象 { Response.Write(t.ToString() + "
"); //输出查询结果 } } 上述代码在ASP.NET页面中执行了一段LINQ查询,查询字符串中包含“C#”的字符串,运行后如图20-5所示。 图20-5 ASP.NET执行LINQ查询 在ASP.NET中能够使用LINQ进行数据集的查询,Visual St

20、udio 2008已经将LINQ整合成为编程语言中的一部分,基于.NET Framework 3.5的应用程序都可以使用LINQ特性进行数据访问和整合。 20.2.2 基本的LINQ数据查询 使用LINQ能够对数据集进行查询,在ASP.NET中,可以创建一个新的LINQ数据库进行数据集查询,右击现有项目,单击【添加新项】选项,选择【LINQ to SQL类】选项,如图20-6所示。 图20-6 创建LINQ to SQL类 创建一个LINQ to SQL类,能够映射一个数据库,实现数据对象的创建,如图20-7所示。创建一个LINQ to SQL类后,可以直接在服务资源管理器中拖

21、动相应的表到LINQ to SQL类文件中,如图20-8所示。 图20-7 服务资源管理器 图20-8 拖动一个表 开发人员能够直接将服务资源管理器中的表拖动到LINQ to SQL类中,在LINQ to SQL类文件中就会呈现一个表的视图。在视图中,开发人员能够在视图中添加属性和关联,并且能够在LINQ to SQL类文件中可以设置多个表,进行可视化关联操作。 创建一个LINQ to SQL类文件后,LINQ to SQL类就将数据进行对象化,这里的对象化就是以面向对象的思想针对一个数据集建立一个相应的类,开发人员能够使用LINQ to SQL创建的类进行数据

22、库查询和整合操作,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) { MyDataDataContext data = new MyDataDataContext(); //使用LINQ类 var s = from n in data.mynews where n.ID==1 select n; //执行查询 foreach (var t in s) //遍历对象

23、 { Response.Write(t.TITLE.ToString() + "
"); //输出对象 } } 上述创建了一个MyData.dbml的LINQ to SQL文件,开发人员能够直接使用该类的对象提供数据操作。上述代码使用了LINQ to SQL文件提供的类进行数据查询,LINQ查询语句示例代码如下所示。 var s = from n in data.mynews where n.ID==1 select n; //编写查询语

24、句 上述代码使用了LINQ查询语句查询了一个mynews表中ID为1的行,使用LINQ to SQL文件提供的对象能够快速的进行数据集中对象的操作。创建一个MyData.dbml的LINQ to SQL文件,其中MyDataDataContext为类的名称,该类提供LINQ to SQL操作方法,示例代码如下所示。 MyDataDataContext data = new MyDataDataContext(); //使用LINQ类 上述代码使用了LINQ to SQL文件提供的类创建了一个对象data,data对象包含数据中表的集合,通过“.”操作符可以

25、选择相应的表,示例代码如下所示。 data.mynews //选择相应表 使用LINQ查询后运行结果如图20-9所示。 图20-9 LINQ执行数据库查询 使用LINQ技术能够方便的进行数据库查询和整合操作,LINQ不仅能够实现类似SQL语句的查询操作,还能够支持.NET编程方法进行数据查询条件语句的编写。使用LINQ技术进行数据查询的顺序如下所示: q 创建LINQ to SQL文件:创建一个LINQ to SQL类文件进行数据集封装。 q 拖动数据表:将数据表拖动到LINQ to SQL类文件中,可以进行数据表的可视化操作。

26、 q 使用LINQ to SQL类文件:使用LINQ to SQL类文件提供的数据集的封装进行数据操作。 使用LINQ to SQL类文件能够极快的创建一个LINQ到SQL数据库的映射并进行数据集对象的封装,开发人员能够使用面向对象的方法进行数据集操作并提供快速开发的解决方案。 20.2.3 IEnumerable和IEnumerable接口 IEnumerable和IEnumerable接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和IEnumerable接口是.NET Fram

27、ework中最基本的集合访问器,这两个接口对于LINQ的理解是非常重要的。 在面向对象的开发过程中,常常需要创建若干对象,并进行对象的操作和查询,在创建对象前,首先需要声明一个类为对象提供描述,示例代码如下所示。 using System; using System.Collections.Generic; using System.Linq; //使用LINQ命名控件 using System.Text; namespace IEnumeratorSample { class Person //定义一个Person类

28、{ public string Name; //定义Person的名字 public string Age; //定义Person的年龄 public Person(string name, string age) //为Person初始化(构造函数) { Name = name; //配置Name值 Age = age; //配置Age值 } } 上述代码定义了一个

29、Person类并抽象一个Person类的属性,这些属性包括Name和Age。Name和Age属性分别用于描述Person的名字和年龄,用于数据初始化。初始化之后的数据就需要创建一系列Person对象,通过这些对象的相应属性能够进行对象的访问和遍历,示例代码如下所示。 class Program { static void Main(string[] args) { Person[] per = new Person[2] //创建并初始化2个Person对象 {

30、 new Person("guojing","21"), //通过构造函数构造对象 new Person("muqing","21"), //通过构造函数构造对象 }; foreach (Person p in per) //遍历对象 Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age); Console.ReadKey();

31、 } } } 上述代码创建并初始化了2个Person对象,并通过foreach语法进行对象的遍历。但是上述代码是在数组中进行查询的,就是说如果要创建多个对象,则必须创建一个对象的数组,如上述代码中的Per变量,而如果需要直接对对象的集合进行查询,却不能够实现查询功能。例如增加一个构造函数,该构造函数用户构造一组Person对象,示例代码如下所示。 private Person[] per; public Person(Person[] array) //重载构造函数,迭代对象 {

32、 per = new Person[array.Length]; //创建对象 for (int i = 0; i < array.Length; i++) //遍历初始化对象 { per[i] = array[i]; //数组赋值 } } 上述构造函数动态的构造了一组People类的对象,那么应该也能够使用foreach语句进行遍历,示例代码如下所示。 Person personlist = new Pe

33、rson(per); //创建对象 foreach (Person p in personlist) //遍历对象 { Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age); } 在上述代码的foreach语句中,直接在Person类的集合中进行查询,系统则会报错“ConsoleApplication1.Person”不包含“GetEnumerator”的公共定义,因此foreach语句不能作用

34、于“ConsoleApplication1.Person”类型的变量,因为Person类并不支持foreach语句进行遍历。为了让相应的类能够支持foreach语句执行遍历操作,则需要实现派生自类IEnumerable并实现IEnumerable接口,示例代码如下所示。 public IEnumerator GetEnumerator() //实现接口 { return new GetEnum(_people); } 为了让自定义类型能够支持foreach语句,则必须对Person类的构造函数进行编写并实现接口,示例代码如下所示。

35、 class Person:IEnumerable //派生自IEnumerable,同样定义一个Personl类 { public string Name; //创建字段 public string Age; //创建字段 public Person(string name, string age) //字段初始化 { Name = name; //配置Name值 Age = age; //配

36、置Age值 } public IEnumerator GetEnumerator() //实现接口 { return new PersonEnum(per); //返回方法 } } 上述代码重构了Person类并实现了接口,接口实现的具体方法如下所示。 class PersonEnum : IEnumerator //实现foreach语句内部,并派生 { public Person[] _per; //实现数组 int

37、 position = -1; //设置“指针” public PersonEnum(Person[] list) { _per = list; //实现list } public bool MoveNext() //实现向前移动 { position++; //位置增加 return (position < _per.Length); //返回布尔值 } public void Reset()

38、 //位置重置 { position = -1; //重置指针为-1 public object Current //实现接口方法 { get { try { return _per[position]; //返回对象 } catch (IndexOutOfRangeException) //捕获异常 {

39、 throw new InvalidOperationException(); //抛出异常信息 } } } } 上述代码实现了foreach语句的功能,当开发Person类初始化后就可以直接使用Personal类对象的集合进行LINQ查询,示例代码如下所示。 static void Main(string[] args) { Person[] per = new Person[2] //同样初始化并定义2个Person对象

40、 { new Person("guojing","21"), //构造创建新的对象 new Person("muqing","21"), //构造创建新的对象 }; Person personlist = new Person(per); //初始化对象集合 foreach (Person p in personlist) //使用foreach语句 Console.Wri

41、teLine("Name is " + p.Name + " and Age is " + p.Age); Console.ReadKey(); } 从上述代码中可以看出,初始化Person对象时初始化的是一个对象的集合,在该对象的集合中可以通过LINQ直接进行对象的操作,这样做即封装了Person对象也能够让编码更加易读。在.NET Framework 3.5中,LINQ支持数组的查询,开发人员不必自己手动创建IEnumerable和IEnumerable接口以支持某个类型的foreach编程方法,但是IEnumerable和IEnumer

42、able是LINQ中非常重要的接口,在LINQ中也大量的使用IEnumerable和IEnumerable进行封装,示例代码如下所示。 public static IEnumerable Where (this IEnumerable source,Func predicate) //内部实现 { foreach (TSource element in source) //内部遍历传递的集合 {

43、 if (predicate(element)) yield return element; //返回集合信息 } } 上述代码为LINQ内部的封装,从代码中可以看到,在LINQ内部也大量的使用了IEnumerable和IEnumerable接口实现LINQ查询。IEnumerable原本就是.NET Framework中最基本的集合访问器,而LINQ是面向关系(有序N元组集合)的,自然也就是面向IEnumerable的,所以了解IEnumerable和IEnum

44、erable对LINQ的理解是有一定帮助的。 20.2.4 IQueryProvider和IQueryable接口 IQueryable和IQueryable同样是LINQ中非常重要的接口,在LINQ查询语句中,IQueryable和IQueryable接口为LINQ查询语句进行解释和翻译工作,开发人员能够通过重写IQueryable和IQueryable接口以实现用不同的方法进行不同的LINQ查询语句的解释。 IQueryable继承于IEnumerable和IQueryable接口,在IQueryable中包括两个重要的属性,这两个属性分别

45、为Expression和Provider。Expression和Provider分别表示获取与IQueryable 的实例关联的表达式目录树和获取与数据源关联的查询提供程序,Provider作为其查询的翻译程序实现LINQ查询语句的解释。通过IQueryable和IQueryable接口,开发人员能够自定义LINQ Provider。 注意:Provider可以被看做是一个提供者,用于提供LINQ中某个语句的解释工具,在LINQ中通过编程的方法能够实现自定义Provider。 在IQueryable和IQueryable接口中,还需要另外一个接口,这个接口就是IQueryPro

46、vider,该接口用于分解表达式,实现LINQ查询语句的解释工作,这个接口也是整个算法的核心。IQueryable接口在MSDN中的定义如下所示。 public interface IQueryable : IEnumerable, IQueryable, IEnumerable { } public interface IQueryable : IEnumerable { Type ElementType { get; } //获取元素类型 Expression Expression { get; } //获取表达

47、式 IQueryProvider Provider { get; } //获取提供者 } 上述代码定义了IQueryable接口的规范,用于保持数据源和查询状态,IQueryProvider在MSDN中定义如下所示。 public interface IQueryProvider { IQueryable CreateQuery(Expression expression); //创建可执行对象 IQueryable CreateQuery(Expression expression); /

48、/创建可执行对象 object Execute(Expression expression); //计算表达式 TResult Execute(Expression expression); //计算表达式 } IQueryProvider用于LINQ查询语句的核心算法的实现,包括分解表达式和表达式计算等。为了能够创建自定义LINQ Provider,可以编写接口的实现。示例代码如下所示。 public IQueryable CreateQuery(Expression exp

49、ression) { query.expression = expression; //声明表达式 return (IQueryable)query; //返回query对象 } 上述代码用于构造一个可用来执行表达式计算的IQueryable 对象,在接口中可以看到需要实现两个相同的执行表达式的IQueryable 对象,另一个则是执行表达式对象的集合,其实现代码如下所示。 public IQueryable CreateQuery(Exp

50、ression expression) { return CreateQuery(expression); //返回表达式的集合 } 而作为表达式解释和翻译的核心接口,则需要通过算法实现相应Execute方法,示例代码如下所示。 public TResult Execute(Expression expression) { var exp = expression as MethodCallExpression; //创建表达

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服