LINQ技术及编程

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

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

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

资源描述

1LINQWeb开发框架技术初级LINQ简介Web开发框架技术初级3本章主要内容本章主要介绍LINQ的基本概念和组成,它的工作原理,以及几种不同的实现形式。语言集成LINQ如何工作LINQ是什么为什么需要LINQ语言集成4LINQ?LINQ是LanguageIntegratedQuery的缩写,意即语言集成查询)。它有许多种解释,例如:•LINQ是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。•LINQ是另外一种可以把SQL查询嵌入代码的工具。•LINQ是另外一种数据抽象层。所有这些说明在某种程度上是正确的,但是都只说明了LINQ的一个方面。实际上,LINQ是一种全新的查询工具。51.1LINQ是什么LINQ是一个把查询当作头等概念引入所有微软.NET语言的编程模型。但是,现有的编程语言完全支持LINQ还需要添加一些扩展内容。经过扩展,LINQ提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如:RAD/原型客户端/服务器三层/多层体系结构智能客户端6LINQ和.NET语言的关系启用LINQ的数据源ADO.NETLINQ技术C#其他VB.NET语言集成查询LINQLINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML启用LINQ的数据源ADO.NETLINQ技术对象关系XML7.NET各个版本的关系NET2.0CLRWinFormsWebServicesASP.NETNET3.0WCFWFWPFCardSpaceLINQAJAXRESTNET3.5.NET2.0是整个.NET的核心.NET3.0是在.NET2.0的基础上增加了WPF、WCF、WF、CardSpace等跟Vista有关的组件.NET3.5除了包含.NET3.0的全部功能外,增加了对LINQ、Ajax等技术支持的全新框架库和编译器8LINQ的发展经历作为微软VisualStudio2005的扩展内容以技术预览的形式首先发布20082007.112005.9包含了LINQtoObjects和LINQtoADO.ENT三大模块块后正式发布增加LINQtoEntities组件及扩展后发布91.2为什么需要LINQ原来的SQL只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、XML文档、数据库、文本文件、注册表项、网页、电子邮件信息、简单对象访问协议(SOAP)消息内容、微软的Excel电子表等,特别是大量非结构化数据,都是用SQL无法访问的。10例子1.1一个简单的LINQ查询程序usingSystem;usingSystem.Linq;string[]greetings={“helloworld”,“helloLINQ”,“helloApress”};varitems=fromsingreetingswheres.EndsWith(“LINQ”);selects;foreach(variteminitems)Console.WriteLine(item);在vs2008中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行LINQ查询。显示结果为:helloLINQ11访问数据源的数据模型每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用SQL,操纵XML数据时,则使用文档对象模型MOD或XPath/XQuery。使用不同的编程模型可以访问不同的数据源。但是这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如利用Windows管理规范以ODBC访问Excel等。12LINQ技术的独特方法LINQ在总结了以前的经验后,没有走统一各种不同的数据模型的结构从而建立一个“通用”模型的方法,而是利用不同数据模型中操作具有的通用功能来实现这个目的。换句话说,使用LINQ时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中的数据,使用LINQ就可以对他们使用相同的查询语法。13例子1.2一个简单LINQ查询设计一个LINQ查询,在Customers数据表中搜索所属国籍是意大利的那些公司的名称,代码如下所示:varquery=fromcinCustomerswherec.Country==“Italy”selectc.CompanyName;该查询返回的结果是一个字符串列表,可以用C#语句按照枚举的方式显示这些返回值,即:foreach(stringnameinquery){Console.WriteLine(name);}14简单LINQ查询的说明1.var、query和foreach都是标准的C#3.0的语句,分别表示执行的LINQ查询和对于对象的循环控制。在其中添加一个名为Search.ascx的文件2.c、Customers是已定义的实体类。3.from、where、select都是LINQ的关键字,分别表示指定数据源、查找条件和确定要查找的数据内容。15关于Customers的讨论上例中的Customers可以是:对象集,例如:Customer[]Customers;数据集中的DataTable,例如:DataSetds=GetDataSet();DataTableCustomers=ds.Tables[“Customers”];描述关系型数据库中物理表的实体类,例如:DataContextdb=newDataContext(ConnectionString);TableCustomerCustomers=db.GetTableCustomer();描述概念模型并被映射到关系型数据库中的实体类,例如:NorthwindModeldataModel=newNorthwindModel();ObjectQueryCustomerCustomers=dataModel.Customers;16LINQ构件块、LINQ提供器和相应数据源LINQ构件块编程语言:C#VB.NET…Others标准查询操作符查询表达式表达式树LINQ提供器LINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML…数据源对象RDBMSXMLDataSetADO.NETEntity框架?Others17我们知道,在一般编程语言中执行SQL查询时,是把SQL语句嵌入到程序中。这些SQL语句没有集成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。与SQL不同,LINQ则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、XML文档等非结构化的数据。那么,LINQ是如何工作的呢?1.3LINQ如何工作18LONQ查询的处理过程使用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};19LINQ对宿主语言的扩展从上面的例子可见,首先在Customers上调用Where,然后在Where返回的对象上调用OrderBy进行排序,最后在OrderBy返回的对象上调用Select。这是由使用的宿主语言(C#)中的扩展方法(LINQ)在管理这种查询行为。该例子中的查询调用的Where、OrderBy、Select方法的实现形式,取决于Customers的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是LINQ使用的基础语法特征,LINQ就是采用这种相同的语法来操作不同的数据源。20LINQ对于数据的适时操作LINQ查询只有在需要使用其返回结果时才会执行,否则它不会被执行。例如,下面的例子中,仅当执行foreach循环语句时才执行LINQ访问:varquery=fromcinCustomers…(非冯结构)foreach(stringnameinquery)…迭代LINQ查询返回结果并在内存中生成持久性数据副本的方法也是这样:varquery=fromcinCustomers…(非冯结构)ListCustomerCustomers=query.ToList();21LINQ对于数据库的延迟访问当LINQ查询操作关系型数据库(比如SQLServer)中的数据时,它将生成等价的SQL语句,而不会操作内存中的数据表的副本。并且,LINQ对数据库的查询将被延迟,直至首次访问该查询结果为止。若前两个例子中,Customers是TableCustomer类型(物理表)或ObjectQueryCustomer类型(概念实体),在执行foreach循环语句之前,或者在调用ToList方法之前,都不会把等价的SQL查询发送到数据库。22例子1.3用LINQ查询XMLusingSystem;usingSystem.Linq;usingSystem.Xml.Linq;XElementbooks=XElement.Parse(@”booksbooktitleProLINQ:LanguageIntegratedQueryinC#2008/titleauthorJoeRattz/author/bookbooktitleProWF:WindowsWorkflowin.NET3.0/titleauthorBruceBukovics/author/bookbooktitleProC#2005andthe.NET2.0Platform,ThirdEdition/titleauthorAndrewTroelsen/author/book/books”);23例子1.3用LINQ查询XML(续)varitems=frombookinbooks.Elements(“book”)where(string)book.Element(“author”)==“JoeRattz”;selectbook.Element(“title”);foreach(vartitleintitles)Console.WriteLine(title.Value);在vs2008中创建这个工程,编辑程序、编译、链接,执行。显示结果为:本例没有创建一个XmlDocument,而是把XML数据解析为XElment类型的对象,很方便的对XMLAPI进行了扩充。ProLINQ:LanguageIntegratedQueryinC#200824例子1.4用LINQ查询SQL数据库usingSystem;usingSystem.Linq;usingSystem.Data.Linq;usingnwind;Northwinddb=newNorthwind(@“DataSource=.\SQLEXPRESS;InitialCatalog=Northwind”);varcusts=fromcindb.Customerswherec.City==“Rio

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

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

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

×
保存成功