您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > VisualC2008大学教程第二十章
第二十章LINQ与XML、SQL天津理工大学华信软件学院张一鸣2011年12月2日C#语言程序设计第20章LINQ与XML、SQL•LINQ的基本概念•如何用LINQ查询数组•基本.NET集合概念•如何创建与使用List泛型集合•如何编写泛型方法•如何用LINQ查询List泛型集合本章主要内容:20.1LINQ是什么LINQ是一个把查询当作头等概念引入所有微软.NET语言的编程模型。但是,现有的编程语言完全支持LINQ还需要添加一些扩展内容。经过扩展,LINQ提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如:RAD/原型客户端/服务器三层/多层体系结构智能客户端LINQ?LINQ是LanguageIntegratedQuery的缩写,意即语言集成查询。它有许多种解释,例如:•LINQ是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。•LINQ是另外一种可以把SQL查询嵌入代码的工具。•LINQ是另外一种数据抽象层。所有这些说明在某种程度上是正确的,但是都只说明了LINQ的一个方面。实际上,LINQ是一种全新的查询工具。LINQ和.NET语言的关系启用LINQ的数据源ADO.NETLINQ技术C#其他VB.NET语言集成查询LINQLINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML启用LINQ的数据源ADO.NETLINQ技术对象关系XML.NET各个版本的关系NET2.0CLRWinFormsWebServicesASP.NETNET3.0WCFWFWPFCardSpaceLINQAJAXRESTNET3.5.NET2.0是整个.NET的核心.NET3.0是在.NET2.0的基础上增加了WPF、WCF、WF、CardSpace等跟Vista有关的组件.NET3.5除了包含.NET3.0的全部功能外,增加了对LINQ、Ajax等技术支持的全新框架库和编译器LINQ的发明者•最初由AndersHejlsberg构思,最初的研究计划称为Cω•2007年11月19日–LINQ作为.NETFramework3.5的一部分正式发布AndersHejlsbergLINQ要解决的问题面向对象与数据访问两个领域长期分裂,各自为政•编程语言中的数据类型与数据库中的数据类型形成两套体系。•SQL编码体验落后•SQL和XML都有各自的查询语言,而对象没有自己的查询语言LINQ的发展经历作为微软VisualStudio2005的扩展内容以技术预览的形式首先发布20082007.112005.9包含了LINQtoObjects和LINQtoADO.ENT三大模块块后正式发布增加LINQtoEntities组件及扩展后发布20.2为什么需要LINQ原来的SQL只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、XML文档、数据库、文本文件、注册表项、网页、电子邮件信息、简单对象访问协议(SOAP)消息内容、微软的Excel电子表等,特别是大量非结构化数据,都是用SQL无法访问的。例子20.1一个简单的LINQ查询程序usingSystem;usingSystem.Linq;string[]greetings={“helloworld”,“helloLINQ”,“helloApress”};varitems=fromsingreetingswheres.EndsWith(“LINQ”);selects;foreach(variteminitems)Console.WriteLine(item);在vs2008中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行LINQ查询。显示结果为:helloLINQLINQ查询语句简介要使用LINQ查询,首先要导入System.Linq名字空间,其中包含了对象LINQ的提供者。例如:usingSystem.Linq;LINQ查询的格式一般为:fromvalueinvalueswherecondition(如:value4)orderbyvalue[descending|ascending]selectvalue;子句说明在上面的LINQ查询语句中,出现了几个子句:以from子句开始,要指定范围变量(value)和要查询的数据源(values)。范围变量表示数据源中的每个项,相当于foreach语句中的控制变量。where子句的条件为真,则选中这个元素,即把它放进结果中。select子句确定结果中显示什么值。也就是范围变量中满足where条件为真的那些变量。LINQ查询一般以此句结束。orderby子句可以对选中的值按照升序或降序排列。访问数据源的数据模型每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用SQL,操纵XML数据时,则使用文档对象模型MOD或XPath/XQuery。使用不同的编程模型可以访问不同的数据源。但是这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如利用Windows管理规范以ODBC访问Excel等。LINQ技术的独特方法LINQ在总结了以前的经验后,没有走统一各种不同的数据模型的结构从而建立一个“通用”模型的方法,而是利用不同数据模型中操作具有的通用功能来实现这个目的。换句话说,使用LINQ时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中的数据,使用LINQ就可以对他们使用相同的查询语法。例子20.2一个简单LINQ查询设计一个LINQ查询,在Customers数据表中搜索所属国籍是意大利的那些公司的名称,代码如下所示:varquery=fromcinCustomerswherec.Country==“Italy”selectc.CompanyName;该查询返回的结果是一个字符串列表,可以用C#语句按照枚举的方式显示这些返回值,即:foreach(stringnameinquery){Console.WriteLine(name);}简单LINQ查询的说明1.var、query和foreach都是标准的C#3.0的语句,分别表示执行的LINQ查询和对于对象的循环控制。在其中添加一个名为Search.ascx的文件2.c、Customers是已定义的实体类。3.from、where、select都是LINQ的关键字,分别表示指定数据源、查找条件和确定要查找的数据内容。关于Customers的讨论上例中的Customers可以是:•对象集,例如:Customer[]Customers;•数据集中的DataTable,例如:DataSetds=GetDataSet();DataTableCustomers=ds.Tables[“Customers”];•描述关系型数据库中物理表的实体类,例如:DataContextdb=newDataContext(ConnectionString);TableCustomerCustomers=db.GetTableCustomer();•描述概念模型并被映射到关系型数据库中的实体类,例如:NorthwindModeldataModel=newNorthwindModel();ObjectQueryCustomerCustomers=dataModel.Customers;LINQ构件块、LINQ提供器和相应数据源LINQ构件块编程语言:C#VB.NET…Others标准查询操作符查询表达式表达式树LINQ提供器LINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML…数据源对象RDBMSXMLDataSetADO.NETEntity框架?Others我们知道,在一般编程语言中执行SQL查询时,是把SQL语句嵌入到程序中。这些SQL语句没有集成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。与SQL不同,LINQ则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、XML文档等非结构化的数据。那么,LINQ是如何工作的呢?20.3LINQ如何工作LINQ查询的处理过程使用LINQ编写查询代码时,如下例:C#编译器会生成下列代码:Customer[]Customers=GetCustomers();varquery=fromcinCustomerswherec.Country==“Italy”orderbyc.Nameselectnew{c.Name,c.City};Customer[]Customers=GetCustomers();IEnumerable《Customerquery=Customers.where(c=c.Country==“Italy”);.OrderBy(c=c.Name).Select(c=new{c.Name,c.City};LINQ对宿主语言的扩展从上面的例子可见,首先在Customers上调用Where,然后在Where返回的对象上调用OrderBy进行排序,最后在OrderBy返回的对象上调用Select。这是由使用的宿主语言(C#)中的扩展方法(LINQ)在管理这种查询行为。该例子中的查询调用的Where、OrderBy、Select方法的实现形式,取决于Customers的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是LINQ使用的基础语法特征,LINQ就是采用这种相同的语法来操作不同的数据源。LINQ对于数据的适时操作LINQ查询只有在需要使用其返回结果时才会执行,否则它不会被执行。例如,下面的例子中,仅当执行foreach循环语句时才执行LINQ访问:varquery=fromcinCustomers…(非冯结构)foreach(stringnameinquery)…迭代LINQ查询返回结果并在内存中生成持久性数据副本的方法也是这样:varquery=fromcinCustomers…(非冯结构)ListCustomerCustomers=query.ToList();查询执行的时机vareven=numbers.Where(p=p%2==0).Select(p={Console.WriteLine(Hi!+p.ToString());returnp;});int[]numbers=newint[]{6,4,3,2,9,1,7,8,5};定义查询获取数据源执行查询foreach(varitemineven){}从前面的试验中,我们发现一次查询实际经过以下三步123查询执行的时机小结•查询分为以下三步:获取数据源、定义查询、执行查询;•定义查询后,查询直到需要枚举结果时才被真正执行,这种方式称为“延迟执行(deferredexecution)”;•当查询方法返回单一值时,查询立即执行;•因此,可以通过以下技巧在定义查询时就强制执行查询;例子20.3用LINQ查询XMLusingSystem;usingSystem.Linq;usingSystem.Xml.Linq;XElementbooks=XElement.Parse(@”booksbooktitleProLINQ:LanguageIntegratedQueryinC#2008/titleauthorJoeRattz/author/bookbooktitleProWF:
本文标题:VisualC2008大学教程第二十章
链接地址:https://www.777doc.com/doc-2854891 .html