LINQ技术及编程1.ppt
《LINQ技术及编程1.ppt》由会员分享,可在线阅读,更多相关《LINQ技术及编程1.ppt(93页珍藏版)》请在三一文库上搜索。
1、1,LINQ从入门到精通,Web开发框架技术初级 天津理工大学华信软件学院 张一鸣 2011年6月24日,第一章 LINQ简介,2011年6月24日,Web开发框架技术初级,3,本章主要内容,本章主要介绍LINQ的基本概念和组成,它的工作原理,以及几种不同的实现形式。,语言集成,LINQ如何工作,LINQ是什么,为什么需要LINQ,语言集成,4,LINQ?,LINQ是Language Integrated Query的缩写,意即语言集成查询) 。它有许多种解释,例如: LINQ是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。 LINQ是另外一种可以把SQL查询嵌入
2、代码的工具。 LINQ是另外一种数据抽象层。 所有这些说明在某种程度上是正确的,但是都只说明了LINQ的一个方面。实际上,LINQ是一种全新的查询工具。,5,1.1 LINQ是什么,LINQ是一个把查询当作头等概念引入所有微软.NET语言的编程模型。但是,现有的编程语言完全支持LINQ还需要添加一些扩展内容。经过扩展,LINQ提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如: RAD/原型 客户端/服务器 三层/多层体系结构 智能客户端,6,LINQ和.NET语言的关系,启用LINQ的数据源 ADO.NET LINQ技术,C#,其他,VB,.
3、NET语言集成查询LINQ,LINQ to DataSet,LINQ to SQL,LINQ to Entities,LINQ to Objects,LINQ to XML,启用LINQ的数据源 ADO.NET LINQ技术,对象,关系,XML,7,.NET各个版本的关系,NET 2.0 CLR WinForms WebServices ASP.NET,NET 3.0,WCF WF WPF,CardSpace,LINQ AJAX REST,NET 3.5,.NET 2.0是整个.NET的核心 .NET3.0是在.NET 2.0的基础上增加了WPF、WCF、WF、CardSpace等跟Vista
4、有关的组件 .NET 3.5除了包含.NET 3.0的全部功能外,增加了对LINQ、Ajax等技术支持的全新框架库和编译器,8,LINQ的发展经历,作为微软Visual Studio 2005的 扩展内容以技术预览的形式首先发布,2008,2007.11,2005.9,包含了LINQ to Objects和 LINQ to ADO.ENT三大模块 块后正式发布,增加LINQ to Entities组件及扩展后发布,9,1.2 为什么需要LINQ,原来的SQL只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、XML文档、数据库、文本文
5、件、注册表项、网页、电子邮件信息、简单对象访问协议(SOA P)消息内容、微软的Excel电子表等,特别是大量非结构化数据,都是用SQL无法访问的。,10,例子1.1 一个简单的LINQ查询程序,using System; using System.Linq; string greetings = “hello world”, “hello LINQ”, “hello Apress” ; var items = from s in greetings where s.EndsWith (“LINQ”); select s; foreach ( var item in items ) Conso
6、le.WriteLine ( item ); 在vs2008中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行LINQ 查询。显示结果为:,hello LINQ,11,访问数据源的数据模型,每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用SQL,操纵XML数据时,则使用文档对象模型MOD或XPath/XQuery。使用不同的编程模型可以访问不同的数据源。但是这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。 为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如
7、利用Windows管理规范以ODBC访问Excel等。,12,LINQ技术的独特方法,LINQ在总结了以前的经验后,没有走统一各种不同的数据模型的结构从而建立一个“通用”模型的方法,而是利用不同数据模型中操作具有的通用功能来实现这个目的。 换句话说,使用LINQ时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中的数据,使用LINQ就可以对他们使用相同的查询语法。,13,例子1.2 一个简单LINQ查询,设计一个LINQ查询,在Customers数据表中搜索所属国籍是意大利的那些公司
8、的名称,代码如下所示: var query = from c in Customers where c.Country = “Italy” select c.CompanyName; 该查询返回的结果是一个字符串列表,可以用C#语句按照枚举的方式显示这些返回值,即: foreach ( string name in query ) Console.WriteLine ( name ); ,14,简单LINQ查询的说明,var、query和foreach都是标准的C#3.0的语句,分别表示执行的LINQ查询和对于对象的循环控制。在其中添加一个名为Search.ascx的文件 c、Customer
9、s是已定义的实体类。 from、where、select都是LINQ的关键字,分别表示指定数据源、查找条件和确定要查找的数据内容。,15,关于Customers的讨论,上例中的Customers可以是: 对象集,例如:Customer Customers; 数据集中的DataTable,例如: DataSet ds = GetDataSet( ); DataTable Customers = ds.Tables“Customers” ; 描述关系型数据库中物理表的实体类,例如: DataContext db = new DataContext ( ConnectionString ); Tab
10、le Customers = db.GetTable(); 描述概念模型并被映射到关系型数据库中的实体类,例如: NorthwindModel dataModel = new NorthwindModel( ); ObjectQuery Customers = dataModel. Customers;,16,LINQ构件块、LINQ提供器和相应数据源,LINQ构件块,编程语言: C# VB.NET Others,标准查询操作符,查询表达式,表达式树,LINQ提供器,LINQ to DataSet,LINQ to SQL,LINQ to Entities,LINQ to Objects,LIN
11、Q to XML,数据源,对象,RDBMS,XML,DataSet,ADO.NET Entity框架,?,Others,17,我们知道,在一般编程语言中执行SQL查询时,是把SQL语句嵌入到程序中。这些SQL语句没有集成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。 与SQL不同,LINQ则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、XML文档等非结构化的数据。 那么,LINQ 是如何工作的呢?,1.3 LINQ如何工作,18,LONQ查询的处理过程,使用LINQ编写查询代码时,如下例: C#编译器会生成下列代码:,Customer Cu
12、stomers = GetCustomers( ); var query = from c in Customers where c.Country = = “Italy” orderby c.Name select new c.Name, c.City ;,Customer Customers = GetCustomers( ); IEnumerableCustomer query = Customers .where ( c = c.Country = = “Italy” ); .OrderBy ( c = c.Name ) .Select ( c = new c.Name, c.City
13、 ;,19,LINQ对宿主语言的扩展,从上面的例子可见,首先在Customers上调用Where,然后在Where返回的对象上调用OrderBy进行排序,最后在OrderBy返回的对象上调用Select。这是由使用的宿主语言(C#)中的扩展方法(LINQ)在管理这种查询行为。 该例子中的查询调用的Where、OrderBy、Select方法的实现形式,取决于Customers的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是LINQ使用的基础语法特征,LINQ就是采用这种相同的语法
14、来操作不同的数据源。,20,LINQ对于数据的适时操作,LINQ查询只有在需要使用其返回结果时才会执行,否则它不会被执行。例如,下面的例子中,仅当执行foreach循环语句时才执行LINQ访问: var query = from c in Customers (非冯结构) foreach ( string name in query ) 迭代LINQ查询返回结果并在内存中生成持久性数据副本的方法也是这样: var query = from c in Customers (非冯结构) List Customers = query.ToList( );,21,LINQ对于数据库的延迟访问,当LIN
15、Q查询操作关系型数据库(比如SQL Server)中的数据时,它将生成等价的SQL语句,而不会操作内存中的数据表的副本。 并且,LINQ对数据库的查询将被延迟,直至首次访问该查询结果为止。 若前两个例子中,Customers是Table类型(物理表)或ObjectQuery类型(概念实体),在执行foreach循环语句之前,或者在调用ToList方法之前,都不会把等价的SQL查询发送到数据库。,22,例子1.3 用LINQ查询XML,using System; using System.Linq; using System.Xml.Linq; XElement books = XElement
16、.Parse ( ” Pro LINQ: Language Integrated Query in C# 2008 Joe Rattz Pro WF: Windows Workflow in .NET 3.0 Bruce Bukovics Pro C# 2005 and the .NET 2.0 Platform, Third Edition Andrew Troelsen ”);,23,例子1.3 用LINQ查询XML (续),var items = from book in books.Elements (“book”) where (string) book. Element (“aut
17、hor”)= “Joe Rattz” ; select book.Element (“title”); foreach ( var title in titles ) Console.WriteLine ( title.Value ); 在vs2008中创建这个工程,编辑程序、编译、链接,执行。显示结果为: 本例没有创建一个XmlDocument,而是把XML数据解析为XElment类型的对象,很方便的对XML API进行了扩充。,Pro LINQ: Language Integrated Query in C# 2008,24,例子1.4 用LINQ查询SQL数据库,using System
18、; using System.Linq; using System.Data.Linq; using nwind; Northwind db = new Northwind ( “Data Source = .SQLEXPRESS; Initial Catalog= Northwind” ); var custs = from c in db.Customers where c.City = “Rio de Janeiro” select c; foreach ( var cust in custs ) Console.WriteLine (“0”, cust.CompanyName );,2
19、5,例子1.4的分析及运行结果,本例代码要在工程中添加对System.Data.Linq.dll程序集的引用。 添加using System.Data.Linq指令是为使用SQL数据库。 添加using nwind指令是为使用微软的Northwind示例数据库,必须使用SQLMetel命令行工具为目标数据库生成实体类,这个生成的实体类被创建在nwind命名空间中。 本例的运行结果为:,Hanari Carnes Que Delicia Ricardo Adocicados,26,LINQ的智能感应,本例演示了如何查询在Northwind示例数据库中Customers数据表以获得里约热内卢市(
20、Rio de Janeiro )的客户名称。 这段代码与现有的SQL查询方法有明显的区别,其查询操作被集成到编程语言中,使得开发者获得了语言级的支持。以前SQL查询操作是写成一个命令字符串,直到运行该查询命令时才能检查语法错误。而本例中的where语句需要用到Customers数据表中的一个字段,开发者在编程时往往记不住字段的名字。但是因为LINQ集成到语言中,智能感应根据代码中输入的c,就可以自动向开发者显示数据表的所有字段供挑选。,27,1.4 语言集成,语言集成是LINQ的基本部分。其中最显而易见的部分是查询表达式特性。例如前面已经介绍的,我们把lambda表达式构成的查询语句: 简写成
21、查询表达式编写的代码:,Customer Customers = GetCustomers( ); IEnumerableCustomer query = Customers .where ( c = c.Country = = “Italy” ); .OrderBy ( c = c.Name ) .Select ( c = new c.Name, c.City ;,28,语言集成的好处,查询表达式编写的代码: 这样改写后,代码简洁,阅读容易。同时,由于LINQ集成到编程语言(如C#)中,可以在开发者编程时,就对写入的语句实时进行检查并提供智能感应的信息提示。 这种简单的查询表达式检查和引导包
22、括本地类型推断、扩展方法、lambda表达式、对象初始化表达式以及匿名类等。,Customer Customers = GetCustomers( ); var query = from c in Customers where c.Country = = “Italy” orderby c.Name select new c.Name, c.City ;,29,1.4.1 声明性编程,下面的例子展示了SQL查询与等价的LINQ查询程序之间的差别: 采用SQL可编写下列代码: SELECT * FROM Customers WHERE Country = Italy 采用C#的LINQ技术可编
23、写下列代码: public List ItalianCustomers ( Customer Customers ) List result = new List ( ); foreach ( Customer c in Customers ) if ( c.Country = “Italy” ) result.Add ( c ); return result; ,30,上例中的查询语句说明,在SQL查询中,表达的是需要什么,即从客户表中需要查找出那些国家是意大利的客户记录来。而其返回的结果时一个长字符串,还需要大量的后期处理。 在LINQ查询中,表达的是如何得到预期的结果,即专门建立一个列表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINQ 技术 编程
链接地址:https://www.31doc.com/p-2202085.html