LINQ技术及编程.ppt
LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ从入门到精通从入门到精通从入门到精通从入门到精通WebWebWebWeb开发框架技术初级开发框架技术初级开发框架技术初级开发框架技术初级天津理工大学华信软件学院天津理工大学华信软件学院天津理工大学华信软件学院天津理工大学华信软件学院 张一鸣张一鸣张一鸣张一鸣2011201120112011年年年年6 66 6月月月月24242424日日日日1 1LINQ从入门到精通天津理工大学华信软件学院 张一鸣第一章第一章第一章第一章 LINQ LINQ LINQ LINQ简介简介简介简介2011201120112011年年年年6 6 6 6月月月月24242424日日日日WebWeb开发框架技术初级开发框架技术初级2 2LINQ从入门到精通天津理工大学华信软件学院 张一鸣本章主要内容本章主要内容本章主要内容本章主要内容本章主要介绍本章主要介绍LINQ的基本概念和组成,它的的基本概念和组成,它的工作原理,以及几种不同的实现形式。工作原理,以及几种不同的实现形式。语言集成语言集成LINQ如何工作如何工作LINQLINQ是什么是什么为什么需要为什么需要LINQLINQ语言集成语言集成3 3LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ?LINQ LINQ是是Language Integrated QueryLanguage Integrated Query的缩写,意即的缩写,意即语言集成查询)语言集成查询)。它有许多种解释,例如:。它有许多种解释,例如:LINQ是各种类型数据的统一编程模型。它允许使用是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。独立于数据源的一致模型查询和操作数据。LINQ是另外一种可以把是另外一种可以把SQL查询嵌入代码的工具。查询嵌入代码的工具。LINQ是另外一种数据抽象层。是另外一种数据抽象层。所有这些说明在某种程度上是正确的,但是都只说所有这些说明在某种程度上是正确的,但是都只说明了明了LINQ的一个方面。实际上,的一个方面。实际上,LINQ是一种全新的是一种全新的查询工具。查询工具。4 4LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.1 LINQ1.1 LINQ1.1 LINQ1.1 LINQ是什么是什么是什么是什么LINQ是一个把查询当作头等概念引入所有微软是一个把查询当作头等概念引入所有微软.NET语语言的编程模型。但是,现有的编程语言完全支持言的编程模型。但是,现有的编程语言完全支持LINQ还需还需要添加一些扩展内容。经过扩展,要添加一些扩展内容。经过扩展,LINQ提供了一种简化和提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用统一各种类型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如:几种现有的体系结构来访问数据,例如:pRAD/原型原型p客户端客户端/服务器服务器p三层三层/多层体系结构多层体系结构p智能客户端智能客户端5 5LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ和和和和.NET.NET.NET.NET语言的关系语言的关系语言的关系语言的关系启用启用LINQ的数据源的数据源ADO.NETLINQ技术技术C#其他其他VB.NET语言集成查询语言集成查询LINQLINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML启用启用LINQ的数据源的数据源ADO.NETLINQ技术技术对象对象关系关系XML6 6LINQ从入门到精通天津理工大学华信软件学院 张一鸣.NETNETNETNET各个版本的关系各个版本的关系各个版本的关系各个版本的关系NET2.0CLRWinFormsWebServicesASP.NETNET3.0WCFWFWPFCardSpaceLINQAJAXRESTNET3.5.NET2.0是整个是整个.NET的核心的核心.NET3.0是在是在.NET2.0的基础的基础上增加了上增加了WPF、WCF、WF、CardSpace等跟等跟Vista有关有关的组件的组件.NET3.5除了包含除了包含.NET3.0的的全部功能外,增加了对全部功能外,增加了对LINQ、Ajax等技术支持的全新框架等技术支持的全新框架库和编译器库和编译器7 7LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ的发展经历的发展经历的发展经历的发展经历作为微软作为微软作为微软作为微软Visual Studio 2005Visual Studio 2005的的的的扩展内容以技术预览的形式首先发布扩展内容以技术预览的形式首先发布扩展内容以技术预览的形式首先发布扩展内容以技术预览的形式首先发布200820082007.112005.9包含了包含了包含了包含了LINQ to ObjectsLINQ to Objects和和和和LINQ to ADO.ENTLINQ to ADO.ENT三大模块三大模块三大模块三大模块块后正式发布块后正式发布块后正式发布块后正式发布增加增加增加增加LINQ to EntitiesLINQ to Entities组件及扩展后发布组件及扩展后发布组件及扩展后发布组件及扩展后发布8 8LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.2 1.2 1.2 1.2 为什么需要为什么需要为什么需要为什么需要LINQLINQLINQLINQ原来的原来的SQL只能访问包含在结构化的关系型数只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、各种各样的数据源中,比如数组、对象图、XML文文档、数据库、文本文件、注册表项、网页、电子邮档、数据库、文本文件、注册表项、网页、电子邮件信息、简单对象访问协议(件信息、简单对象访问协议(SOAP)消息内容、)消息内容、微软的微软的Excel电子表等,特别是大量非结构化数据,电子表等,特别是大量非结构化数据,都是用都是用SQL无法访问的。无法访问的。9 9LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.1 1.1 1.1 1.1 一个简单的一个简单的一个简单的一个简单的LINQLINQLINQLINQ查询程序查询程序查询程序查询程序usingSystem;usingSystem.Linq;stringgreetings=“helloworld”,“helloLINQ”,“helloApress”;varitems=fromsingreetingswheres.EndsWith(“LINQ”);selects;foreach(variteminitems)Console.WriteLine(item);在在vs2008中创建这个工程,编辑程序、编译、链接,执行,在中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行具有三个元素的字符串数组执行LINQ查询。显示结果为:查询。显示结果为:helloLINQ1010LINQ从入门到精通天津理工大学华信软件学院 张一鸣访问数据源的数据模型访问数据源的数据模型访问数据源的数据模型访问数据源的数据模型每种数据源都有自己特有的数据访问模型。比每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用如,查询数据库时,一般都使用SQL,操纵,操纵XML数数据时,则使用文档对象模型据时,则使用文档对象模型MOD或或XPath/XQuery。使用不同的编程模型可以访问不同的数据源。但是使用不同的编程模型可以访问不同的数据源。但是这造成程序员在编写程序时,当访问不同的数据源这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。维护的工作量与复杂性。为了解决这个问题,软件界做了大量工作,尝为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如试把各种数据访问技术统一成一个综合的模型,如利用利用Windows管理规范以管理规范以ODBC访问访问Excel等。等。1111LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ技术的独特方法技术的独特方法技术的独特方法技术的独特方法LINQ在总结了以前的经验后,没有走统一各种不同在总结了以前的经验后,没有走统一各种不同的数据模型的结构从而建立一个的数据模型的结构从而建立一个“通用通用”模型的方法,模型的方法,而是利用不同数据模型中操作具有的通用功能来实现这而是利用不同数据模型中操作具有的通用功能来实现这个目的。个目的。换句话说,使用换句话说,使用LINQ时,仍然维持现有的各种数据时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种物结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行查询理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中的数据。例如对于内存中的数组和数据库中的关系表中的数据,使用,使用LINQ就可以对他们使用相同的查询语法。就可以对他们使用相同的查询语法。1212LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.2 1.2 1.2 1.2 一个简单一个简单一个简单一个简单LINQLINQLINQLINQ查询查询查询查询设计一个设计一个LINQ查询,在查询,在Customers数据表中搜索所属国籍数据表中搜索所属国籍是意大利的那些公司的名称,代码如下所示:是意大利的那些公司的名称,代码如下所示:varquery=fromcinCustomerswherec.Country=“Italy”selectc.CompanyName;该查询返回的结果是一个字符串列表,可以用该查询返回的结果是一个字符串列表,可以用C#语句按照语句按照枚举的方式显示这些返回值,即:枚举的方式显示这些返回值,即:foreach(stringnameinquery)Console.WriteLine(name);1313LINQ从入门到精通天津理工大学华信软件学院 张一鸣简单简单简单简单LINQLINQLINQLINQ查询的说明查询的说明查询的说明查询的说明1.var、query和和foreach都是标准的都是标准的C#3.0的的语句,分别表示执行的语句,分别表示执行的LINQ查询和对于对查询和对于对象的循环控制。在其中添加一个名为象的循环控制。在其中添加一个名为Search.ascx的文件的文件2.c、Customers是已定义的实体类。是已定义的实体类。3.from、where、select都是都是LINQ的关键字,的关键字,分别表示指定数据源、查找条件和确定要查分别表示指定数据源、查找条件和确定要查找的数据内容。找的数据内容。1414LINQ从入门到精通天津理工大学华信软件学院 张一鸣关于关于关于关于CustomersCustomersCustomersCustomers的讨论的讨论的讨论的讨论上例中的上例中的Customers可以是:可以是:对象集对象集,例如:,例如:CustomerCustomers;数据集中的数据集中的DataTable,例如:,例如:DataSetds=GetDataSet();DataTableCustomers=ds.Tables“Customers”;描述描述关系型数据库中物理表的实体类关系型数据库中物理表的实体类,例如:,例如:DataContextdb=newDataContext(ConnectionString););TableCustomers=db.GetTable();描述描述概念模型并被映射到关系型数据库中的实体类概念模型并被映射到关系型数据库中的实体类,例如:,例如:NorthwindModeldataModel=newNorthwindModel();ObjectQueryCustomers=dataModel.Customers;1515LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ构件块、构件块、构件块、构件块、LINQLINQLINQLINQ提供器和相应数据源提供器和相应数据源提供器和相应数据源提供器和相应数据源LINQ构件块构件块编程语言:编程语言:C#VB.NETOthers标准查询操作符标准查询操作符查询表达式查询表达式表达式树表达式树LINQ提供器提供器LINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXML数据源数据源对象对象RDBMSXMLDataSetADO.NETEntity框架框架?Others1616LINQ从入门到精通天津理工大学华信软件学院 张一鸣我们知道,在一般编程语言中执行我们知道,在一般编程语言中执行SQL查询时,查询时,是把是把SQL语句嵌入到程序中。这些语句嵌入到程序中。这些SQL语句没有集语句没有集成到编程语言本身的语法和类型系统当中,因此编成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。程和调试时都比较麻烦。与与SQL不同,不同,LINQ则是集成到开发语言当中的则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、查询对象、实体、XML文档等非结构化的数据。文档等非结构化的数据。那么,那么,LINQ是如何工作的呢是如何工作的呢?1.3 LINQ1.3 LINQ1.3 LINQ1.3 LINQ如何工作如何工作如何工作如何工作1717LINQ从入门到精通天津理工大学华信软件学院 张一鸣LONQLONQLONQLONQ查询的处理过程查询的处理过程查询的处理过程查询的处理过程使用使用LINQ编写查询代码时,如下例:编写查询代码时,如下例:C#编译器会生成下列代码:编译器会生成下列代码:CustomerCustomers=GetCustomers();varquery=fromcinCustomerswherec.Country=“Italy”orderbyc.Nameselectnewc.Name,c.City;CustomerCustomers=GetCustomers();IEnumerableCustomerquery=Customers.where(c=c.Country=“Italy”);.OrderBy(c=c.Name).Select(c=newc.Name,c.City;1818LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ对宿主语言的扩展对宿主语言的扩展对宿主语言的扩展对宿主语言的扩展从上面的例子可见,首先在从上面的例子可见,首先在Customers上调用上调用Where,然后在然后在Where返回的对象上调用返回的对象上调用OrderBy进行排序,最后进行排序,最后在在OrderBy返回的对象上调用返回的对象上调用Select。这是由使用的宿主。这是由使用的宿主语言(语言(C#)中的扩展方法()中的扩展方法(LINQ)在管理这种查询行为。)在管理这种查询行为。该例子中的查询调用的该例子中的查询调用的Where、OrderBy、Select方法方法的实现形式,取决于的实现形式,取决于Customers的类型(即前述的对象集、的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被数据表、关系型数据库中物理表的实体类、概念模型并被映射到关系型数据库中的实体类),同时也取决于相关的映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是语句指定的命名空间。扩展方法是LINQ使用的基础使用的基础语法特征,语法特征,LINQ就是采用这种相同的语法来操作不同的数就是采用这种相同的语法来操作不同的数据源。据源。1919LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ对于数据的适时操作对于数据的适时操作对于数据的适时操作对于数据的适时操作LINQ查询只有在需要使用其返回结果时才会执行,否则查询只有在需要使用其返回结果时才会执行,否则它不会被执行。例如,下面的例子中,仅当执行它不会被执行。例如,下面的例子中,仅当执行foreach循循环语句时才执行环语句时才执行LINQ访问:访问:varquery=fromcinCustomers(非冯结构)(非冯结构)foreach(stringnameinquery)迭代迭代LINQ查询返回结果并在内存中生成持久性数据副本查询返回结果并在内存中生成持久性数据副本的方法也是这样:的方法也是这样:varquery=fromcinCustomers(非冯结构)(非冯结构)ListCustomers=query.ToList(););2020LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ对于数据库的延迟访问对于数据库的延迟访问对于数据库的延迟访问对于数据库的延迟访问当当LINQ查询操作关系型数据库(比如查询操作关系型数据库(比如SQLServer)中)中的数据时,它将生成等价的的数据时,它将生成等价的SQL语句,而不会操作内存语句,而不会操作内存中的数据表的副本。中的数据表的副本。并且,并且,LINQ对数据库的查询将被延迟,直至首次访问该对数据库的查询将被延迟,直至首次访问该查询结果为止。查询结果为止。若前两个例子中,若前两个例子中,Customers是是Table类型类型(物理表)或(物理表)或ObjectQuery类型(概念实类型(概念实体),在执行体),在执行foreach循环语句之前,或者在调用循环语句之前,或者在调用ToList方法之前,都不会把等价的方法之前,都不会把等价的SQL查询发送到数据库。查询发送到数据库。2121LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.3 1.3 1.3 1.3 用用用用LINQLINQLINQLINQ查询查询查询查询XMLXMLXMLXMLusingSystem;usingSystem.Linq;using;XElementbooks=XElement.Parse(”ProLINQ:LanguageIntegratedQueryinC#2008JoeRattzProWF:WindowsWorkflowin.NET3.0BruceBukovicsProC#2005andthe.NET2.0Platform,ThirdEditionAndrewTroelsen”);2222LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.3 1.3 1.3 1.3 用用用用LINQLINQLINQLINQ查询查询查询查询XMLXMLXMLXML(续)(续)(续)(续)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#20082323LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.4 1.4 1.4 1.4 用用用用LINQLINQLINQLINQ查询查询查询查询SQLSQLSQLSQL数据库数据库数据库数据库usingSystem;usingSystem.Linq;using;usingnwind;Northwinddb=newNorthwind(“DataSource=.SQLEXPRESS;InitialCatalog=Northwind”);varcusts=fromcindb.Customerswherec.City=“RiodeJaneiro”selectc;foreach(varcustincusts)Console.WriteLine(“0”,cust.CompanyName);2424LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.41.41.41.4的分析及运行结果的分析及运行结果的分析及运行结果的分析及运行结果本例代码要在工程中添加对程序集的引用。本例代码要在工程中添加对程序集的引用。添加添加using指令是为使用指令是为使用SQL数据库。数据库。添加添加usingnwind指令是为使用微软的指令是为使用微软的Northwind示示例数据库,必须使用例数据库,必须使用SQLMetel命令行工具为目标数命令行工具为目标数据库生成实体类,这个生成的实体类被创建在据库生成实体类,这个生成的实体类被创建在nwind命名空间中。命名空间中。本例的运行结果为:本例的运行结果为:HanariCarnesQueDeliciaRicardoAdocicados2525LINQ从入门到精通天津理工大学华信软件学院 张一鸣LINQLINQLINQLINQ的智能感应的智能感应的智能感应的智能感应本例演示了如何查询在本例演示了如何查询在Northwind示例数据库中示例数据库中Customers数据表以获得里约热内卢市(数据表以获得里约热内卢市(RiodeJaneiro)的客户名称。)的客户名称。这段代码与现有的这段代码与现有的SQL查询方法有明显的区别,其查查询方法有明显的区别,其查询操作被集成到编程语言中,使得开发者获得了语言级询操作被集成到编程语言中,使得开发者获得了语言级的支持。以前的支持。以前SQL查询操作是写成一个命令字符串,直查询操作是写成一个命令字符串,直到运行该查询命令时才能检查语法错误。而本例中的到运行该查询命令时才能检查语法错误。而本例中的where语句需要用到语句需要用到Customers数据表中的一个字段,数据表中的一个字段,开发者在编程时往往记不住字段的名字。但是因为开发者在编程时往往记不住字段的名字。但是因为LINQ集成到语言中,智能感应根据代码中输入的集成到语言中,智能感应根据代码中输入的c,就可以自,就可以自动向开发者显示数据表的所有字段供挑选。动向开发者显示数据表的所有字段供挑选。2626LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.41.4语言集成语言集成语言集成语言集成语言集成是语言集成是LINQ的基本部分。其中最显而易见的部分的基本部分。其中最显而易见的部分是查询表达式特性。例如前面已经介绍的,我们把是查询表达式特性。例如前面已经介绍的,我们把lambda表达式构成的查询语句:表达式构成的查询语句:简写成查询表达式编写的代码:简写成查询表达式编写的代码:CustomerCustomers=GetCustomers();IEnumerableCustomerquery=Customers.where(c=c.Country=“Italy”);.OrderBy(c=c.Name).Select(c=newc.Name,c.City;2727LINQ从入门到精通天津理工大学华信软件学院 张一鸣语言集成的好处语言集成的好处语言集成的好处语言集成的好处查询表达式编写的代码:查询表达式编写的代码:这样改写后,代码简洁,阅读容易。同时,由于这样改写后,代码简洁,阅读容易。同时,由于LINQ集成集成到编程语言(如到编程语言(如C#)中,可以在开发者编程时,就对写入的语)中,可以在开发者编程时,就对写入的语句实时进行检查并提供智能感应的信息提示。句实时进行检查并提供智能感应的信息提示。这种简单的查询表达式检查和引导包括本地类型推断、扩展这种简单的查询表达式检查和引导包括本地类型推断、扩展方法、方法、lambda表达式、对象初始化表达式以及匿名类等。表达式、对象初始化表达式以及匿名类等。CustomerCustomers=GetCustomers();varquery=fromcinCustomerswherec.Country=“Italy”orderbyc.Nameselectnewc.Name,c.City;2828LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.4.11.4.1声明性编程声明性编程声明性编程声明性编程下面的例子展示了下面的例子展示了SQL查询与等价的查询与等价的LINQ查询程序之间的差别:查询程序之间的差别:采用采用SQL可编写下列代码:可编写下列代码:SELECT*FROMCustomersWHERECountry=Italy采用采用C#的的LINQ技术可编写下列代码:技术可编写下列代码:publicListItalianCustomers(CustomerCustomers)Listresult=newList();foreach(CustomercinCustomers)if(c.Country=“Italy”)result.Add(c);returnresult;2929LINQ从入门到精通天津理工大学华信软件学院 张一鸣上例中的查询语句说明上例中的查询语句说明上例中的查询语句说明上例中的查询语句说明在在SQL查询中,表达的是需要什么,即从客户表中需要查询中,表达的是需要什么,即从客户表中需要查找出那些国家是意大利的客户记录来。而其返回的结查找出那些国家是意大利的客户记录来。而其返回的结果时一个长字符串,还需要大量的后期处理。果时一个长字符串,还需要大量的后期处理。在在LINQ查询中,表达的是如何得到预期的结果,即专门查询中,表达的是如何得到预期的结果,即专门建立一个列表对象集合建立一个列表对象集合List,每当用,每当用LINQ语句从字符串数组语句从字符串数组Customers中找到一个符合条件的中找到一个符合条件的客户名时,就用客户名时,就用Add方法把它添加到结果对象集合中。这方法把它添加到结果对象集合中。这样的语句语法更规范,结果更可用。样的语句语法更规范,结果更可用。LINQ查询用声明性结构取代了迭代的结构描述对数据的查询用声明性结构取代了迭代的结构描述对数据的操作让程序员的意图表达的更明确,使得程序更容易阅操作让程序员的意图表达的更明确,使得程序更容易阅读和维护,从而提高了开发效率。读和维护,从而提高了开发效率。3030LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.4.21.4.2类型检测类型检测类型检测类型检测语言集成的另外一个重要部分是类型检测。LINQ操作数据中,经常会遇到不同对象、变量的数据类型不一致问题,这就有必要进行自动类型检测和变量间自动进行必要的类型转换。在.NET编程语言中(如C#和VB),所有的数据都是强类型的,都支持这种类型检测,包括查询的集合和被读取或被返回的实体。这样就保证了诸如智能感知和重构等特性发挥效能。3131LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.4.31.4.3透明跨越不同的类型系统透明跨越不同的类型系统透明跨越不同的类型系统透明跨越不同的类型系统.NETFramework的数据类型系统与的数据类型系统与SQLServer的的数据类型系统是有区别的,当使用数据类型系统是有区别的,当使用LINQ时,会优先时,会优先考虑考虑.NET系统,因为它是任何承载系统,因为它是任何承载LINQ查询的语言查询的语言都支持的类型系统。可是大部分的数据都保留在关都支持的类型系统。可是大部分的数据都保留在关系型数据库中,这样就必须对各种类型的数据进行系型数据库中,这样就必须对各种类型的数据进行大量的转换。大量的转换。LINQ可以自动处理这两类数据类型系统之间的转换,可以自动处理这两类数据类型系统之间的转换,使类型系统中的这种差异几乎对程序员完全透明。使类型系统中的这种差异几乎对程序员完全透明。3232LINQ从入门到精通天津理工大学华信软件学院 张一鸣跨类型系统的透明转换跨类型系统的透明转换跨类型系统的透明转换跨类型系统的透明转换.NET编程编程语言的数据语言的数据类型系统类型系统SQLServer的数据的数据类型系统类型系统界面界面自自动动转转换换3333LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.5LINQ1.5LINQ的实现形式的实现形式的实现形式的实现形式LINQ是一项覆盖很多数据源的技术,其中有些数据源集成在是一项覆盖很多数据源的技术,其中有些数据源集成在LINQ实现形式中,而这些实现形式是微软提供的实现形式中,而这些实现形式是微软提供的.NETFrame-work3.5的组成部分,如下图所示:的组成部分,如下图所示:每个实现形式都通过扩展方法集进行定义,而扩展方法集需每个实现形式都通过扩展方法集进行定义,而扩展方法集需要的操作符来操作某一特殊的数据源,并由导入的命名空间控要的操作符来操作某一特殊的数据源,并由导入的命名空间控制对这些特性的访问。制对这些特性的访问。LINQtoDataSetLINQtoSQLLINQtoEntitiesLINQtoObjectsLINQtoXMLLINQtoADO.NET3434LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.5.1 LINQ to Objects1.5.1 LINQ to Objects1.5.1 LINQ to Objects1.5.1 LINQ to Objects设计设计LINQtoObjects的目的是操作对象集,对象可的目的是操作对象集,对象可以相互关联并形成一个图。从视图的角度来看,以相互关联并形成一个图。从视图的角度来看,LINQtoObjects是是LINQ查询默认使用的实现形式。查询默认使用的实现形式。需要包括需要包括System.Linq命名空间才能正常使用命名空间才能正常使用LINQtoObjects。LINQtoObjects查询不仅局限于用户生成的数据集查询不仅局限于用户生成的数据集合,它还可以查询从操作系统或文件系统中抽取的信合,它还可以查询从操作系统或文件系统中抽取的信息,或者其它类型的信息。下例演示了从文件系统抽息,或者其它类型的信息。下例演示了从文件系统抽取信息的取信息的LINQ查询。查询。3535LINQ从入门到精通天津理工大学华信软件学院 张一鸣例子例子例子例子1.5 1.5 1.5 1.5 对从文件系统抽取的信息进行对从文件系统抽取的信息进行对从文件系统抽取的信息进行对从文件系统抽取的信息进行LINQLINQLINQLINQ查询查询查询查询本例演示如何对指定目录下的所有文件进行本例演示如何对指定目录下的所有文件进行LINQ查询,查询,找出所有大于找出所有大于10000字节的文件,并按照这些文件的容字节的文件,并按照这些文件的容量大小排序。量大小排序。stringtempPath=Path.GettempPath();DirectoryInfodirInfo=newDirectoryInfo(tempPath);varquery=fromfindirInfo.GetFiles();wheref.length10000orderbyf.lengthdescendingselectf;3636LINQ从入门到精通天津理工大学华信软件学院 张一鸣 LINQ to ADO.NETLINQ to ADO.NET包括三种不同的、共享操作关系数包括三种不同的、共享操作关系数据必需信息的据必需信息的LINQLINQ实现形式:实现形式:LINQ to SQLLINQ to SQL,用于处理,用于处理.NET.NET中自定义类型与物理表架构中自定义类型与物理表架构间的映射。间的映射。LINQ to EntitiesLINQ to Entities,很多方面与,很多方面与LINQ to SQLLINQ to SQL类似,但它类似,但它不把物理数据库当作持久层使用,而是用概念性的实体不把物理数据库当作持久层使用,而是用概念性的实体数据模型(数据模型(Entity Data Model,EDMEntity Data Model,EDM)取代。返回结果)取代。返回结果是独立于物理数据层的抽象层。是独立于物理数据层的抽象层。LINQ to DataSetLINQ to DataSet,可实现使用,可实现使用LINQLINQ查询临时独立于物理查询临时独立于物理数据库的内存数据表中的数据。数据库的内存数据表中的数据。1.5.2 LINQ to ADO.NET1.5.2 LINQ to ADO.NET1.5.2 LINQ to ADO.NET1.5.2 LINQ to ADO.NET3737LINQ从入门到精通天津理工大学华信软件学院 张一鸣1.5.3 LINQ to XML1.5.3 LINQ to XML1.5.3 LINQ to XML1.5.3 LINQ to XMLLINQtoXML提供了一种操作提供了一种操作XML数据的、允许查询和数据操数据的、允许查询和数据操作的、略有区别的语法。而作的、略有区别的语法。而VB2008在此基础上还提供了一种在此基础上还提供了一种支持支持LINQtoXML的特殊类型,即在该语言中包括的的特殊类型,即在该语言中包括的XML字面字面值。这种增强的支持可以简化操作值。这种增强的支持可以简化操作XML数据需要的代码。下面数据需要的代码。下面用用C#编写的查询可以用编写的查询可以用VB2008更简洁的方式表示出来:更简洁的方式表示出来:dimbook=newXElement(“Book”,newXAttribute(“Title”,“ProgrammingLINQ”);frompersoninteamwhereperson.Role=“Author”selectnewXElement(“Author”,person.Name);3838LINQ从入门到精通天津理工大学华信软件学院 张一鸣用用用用VB2008VB2008VB2008VB2008编写的查询编写的查询编写的查询编写的查询用用VB2008以更简洁的方式上述以更简洁的方式上述C#代码为:代码为:Dimbook=_%=FrompersonInteam_whereperson.Role=“Author”select%3939LINQ从入门到精通天津理工大学华信软件学院 张一鸣本课教材与参考资料本课教材与参考资料本课教材与参考资料本课教材与参考资料类型类型书名书名作者作者出版社出版社教材教材 精通精通LINQ程序设计程序设计PaoloPialorsi等等清华大学出版社清华大学出版社参考参考 LINQLINQ高级编程高级编程ScottKlein清华大学出版社清华大学出版社参考参考LINQ技技术详术详解解C#2008版版JosephCRattz,Jr.人民邮电出版社人民邮电出版社参考参考LINQ入入门门及及应应用用王的强等王的强等清华大学出版社清华大学出版社参考参考LINQ从基从基础础到到项项目目实战实战解本巨等解本巨等化学工业出版社化学工业出版社相关网站:相关网站:4040LINQ从入门到精通天津理工大学华信软件学院 张一鸣本章小结本章小结本章小结本章小结本章主要介绍了本章主要介绍了LINQ,并简单介绍了它如何工作,并简单介绍了它如何工作,还使用了集成到还使用了集成到C#这样的主流编程语言中的统一语这样的主流编