《VisualC2008大学教程第二十章ppt课件》由会员分享,可在线阅读,更多相关《VisualC2008大学教程第二十章ppt课件(45页珍藏版)》请在金锄头文库上搜索。
1、第二十章 LINQ与XML、SQL,天津理工大学华信软件学院 张一鸣 2011年12月2日,C#语言程序设计,第20章 LINQ与XML、SQL,LINQ的基本概念 如何用LINQ查询数组 基本.NET集合概念 如何创建与使用List泛型集合 如何编写泛型方法 如何用LINQ查询List泛型集合,本章主要内容:,20.1 LINQ是什么,LINQ是一个把查询当作头等概念引入所有微软.NET语言的编程模型。但是,现有的编程语言完全支持LINQ还需要添加一些扩展内容。经过扩展,LINQ提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如: RAD/原
2、型 客户端/服务器 三层/多层体系结构 智能客户端,LINQ?,LINQ是Language Integrated Query的缩写,意即语言集成查询。它有许多种解释,例如: LINQ是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。 LINQ是另外一种可以把SQL查询嵌入代码的工具。 LINQ是另外一种数据抽象层。 所有这些说明在某种程度上是正确的,但是都只说明了LINQ的一个方面。实际上,LINQ是一种全新的查询工具。,LINQ和.NET语言的关系,启用LINQ的数据源 ADO.NET LINQ技术,C#,其他,VB,.NET语言集成查询LINQ,LINQ to
3、DataSet,LINQ to SQL,LINQ to Entities,LINQ to Objects,LINQ to XML,启用LINQ的数据源 ADO.NET LINQ技术,对象,关系,XML,.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有关的组件 .NET 3.5除了包含.NET 3
4、.0的全部功能外,增加了对LINQ、Ajax等技术支持的全新框架库和编译器,LINQ 的发明者,最初由 Anders Hejlsberg 构思,最初的研究计划称为 C 2007年11月19日 LINQ作为 .NET Framework 3.5 的一部分正式发布,Anders Hejlsberg,LINQ要解决的问题,面向对象与数据访问两个领域长期分裂,各自为政 编程语言中的数据类型与数据库中的数据类型形成两套体系。 SQL 编码体验落后 SQL 和 XML 都有各自的查询语言,而对象没有自己的查询语言,LINQ的发展经历,作为微软Visual Studio 2005的 扩展内容以技术预览的形式
5、首先发布,2008,2007.11,2005.9,包含了LINQ to Objects和 LINQ to ADO.ENT三大模块 块后正式发布,增加LINQ to Entities组件及扩展后发布,20.2 为什么需要LINQ,原来的SQL只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、XML文档、数据库、文本文件、注册表项、网页、电子邮件信息、简单对象访问协议(SOAP)消息内容、微软的Excel电子表等,特别是大量非结构化数据,都是用SQL无法访问的。,例子20.1 一个简单的LINQ查询程序,using System; us
6、ing 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 ) Console.WriteLine ( item ); 在vs2008中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行LINQ 查询。显示结果为:,hello LINQ,LINQ查询语句简介,要使用LINQ查询,
7、首先要导入System.Linq名字空间,其中包含了对象LINQ的提供者。例如:using System.Linq; LINQ查询的格式一般为: from value in values where condition (如:value 4 ) orderby value descending| ascending select value;,子句说明,在上面的LINQ查询语句中,出现了几个子句: 以from子句开始,要指定范围变量(value)和要查询的数据源(values)。范围变量表示数据源中的每个项,相当于foreach语句中的控制变量。 where子句的条件为真,则选中这个元素,即把
8、它放进结果中。 select子句确定结果中显示什么值。也就是范围变量中满足where条件为真的那些变量。 LINQ查询一般以此句结束。 orderby子句可以对选中的值按照升序或降序排列。,访问数据源的数据模型,每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用SQL,操纵XML数据时,则使用文档对象模型MOD或XPath/XQuery。使用不同的编程模型可以访问不同的数据源。但是这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。 为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如利
9、用Windows管理规范以ODBC访问Excel等。,LINQ技术的独特方法,LINQ在总结了以前的经验后,没有走统一各种不同的数据模型的结构从而建立一个“通用”模型的方法,而是利用不同数据模型中操作具有的通用功能来实现这个目的。 换句话说,使用LINQ时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中的数据,使用LINQ就可以对他们使用相同的查询语法。,例子20.2 一个简单LINQ查询,设计一个LINQ查询,在Customers数据表中搜索所属国籍是意大利的那些公司的名称,代码
10、如下所示: var query = from c in Customers where c.Country = “Italy” select c.CompanyName; 该查询返回的结果是一个字符串列表,可以用C#语句按照枚举的方式显示这些返回值,即: foreach ( string name in query ) Console.WriteLine ( name ); ,简单LINQ查询的说明,var、query和foreach都是标准的C#3.0的语句,分别表示执行的LINQ查询和对于对象的循环控制。在其中添加一个名为Search.ascx的文件 c、Customers是已定义的实体类
11、。 from、where、select都是LINQ的关键字,分别表示指定数据源、查找条件和确定要查找的数据内容。,关于Customers的讨论,上例中的Customers可以是: 对象集,例如:Customer Customers; 数据集中的DataTable,例如: DataSet ds = GetDataSet( ); DataTable Customers = ds.Tables“Customers” ; 描述关系型数据库中物理表的实体类,例如: DataContext db = new DataContext ( ConnectionString ); Table Customers
12、 = db.GetTable(); 描述概念模型并被映射到关系型数据库中的实体类,例如: NorthwindModel dataModel = new NorthwindModel( ); ObjectQuery Customers = dataModel. Customers;,LINQ构件块、LINQ提供器和相应数据源,LINQ构件块,编程语言: C# VB.NET Others,标准查询操作符,查询表达式,表达式树,LINQ提供器,LINQ to DataSet,LINQ to SQL,LINQ to Entities,LINQ to Objects,LINQ to XML,数据源,对象
13、,RDBMS,XML,DataSet,ADO.NET Entity框架,?,Others,我们知道,在一般编程语言中执行SQL查询时,是把SQL语句嵌入到程序中。这些SQL语句没有集成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。 与SQL不同,LINQ则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、XML文档等非结构化的数据。 那么,LINQ 是如何工作的呢?,20.3 LINQ如何工作,LINQ查询的处理过程,使用LINQ编写查询代码时,如下例: C#编译器会生成下列代码:,Customer Customers = GetCustome
14、rs( ); 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 ;,LINQ对宿主语言的扩展,从上面的
15、例子可见,首先在Customers上调用Where,然后在Where返回的对象上调用OrderBy进行排序,最后在OrderBy返回的对象上调用Select。这是由使用的宿主语言(C#)中的扩展方法(LINQ)在管理这种查询行为。 该例子中的查询调用的Where、OrderBy、Select方法的实现形式,取决于Customers的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是LINQ使用的基础语法特征,LINQ就是采用这种相同的语法来操作不同的数据源。,LINQ对于数据的适时操
16、作,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( );,查询执行的时机,var even = numbers .Where(p = p % 2 = 0) .Select(p = Console.WriteLine(Hi! + p.ToString(); return p; );,int numbers = new int 6