LINQ技术及编程1_第1页
LINQ技术及编程1_第2页
LINQ技术及编程1_第3页
LINQ技术及编程1_第4页
LINQ技术及编程1_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linq从入门到精通天津理工大学华信软件学院 张一鸣webweb开发框架技术初级开发框架技术初级天津理工大学华信软件学院天津理工大学华信软件学院 张一鸣张一鸣20112011年年6 6月月2424日日linq从入门到精通天津理工大学华信软件学院 张一鸣webweb开发框架技术初级开发框架技术初级linq从入门到精通天津理工大学华信软件学院 张一鸣本章主要介绍本章主要介绍linq的基本概念和组成,它的的基本概念和组成,它的工作原理,以及几种不同的实现形式。工作原理,以及几种不同的实现形式。语言集成语言集成linq如何工作如何工作linqlinq是什么是什么为什么需要为什么需要linqlinq语言

2、集成语言集成linq从入门到精通天津理工大学华信软件学院 张一鸣 linq linq是是language integrated querylanguage integrated query的缩写,意即的缩写,意即语言集成查询)语言集成查询) 。它有许多种解释,例如:。它有许多种解释,例如: linq是各种类型数据的统一编程模型。它允许使用是各种类型数据的统一编程模型。它允许使用独立于数据源的一致模型查询和操作数据。独立于数据源的一致模型查询和操作数据。 linq是另外一种可以把是另外一种可以把sql查询嵌入代码的工具。查询嵌入代码的工具。 linq是另外一种数据抽象层。是另外一种数据抽象层。

3、所有这些说明在某种程度上是正确的,但是都只说所有这些说明在某种程度上是正确的,但是都只说明了明了linq的一个方面。实际上,的一个方面。实际上,linq是一种全新的是一种全新的查询工具。查询工具。linq从入门到精通天津理工大学华信软件学院 张一鸣linq是一个把查询当作头等概念引入所有微软是一个把查询当作头等概念引入所有微软.net语语言的编程模型。但是,现有的编程语言完全支持言的编程模型。但是,现有的编程语言完全支持linq还需还需要添加一些扩展内容。经过扩展,要添加一些扩展内容。经过扩展,linq提供了一种简化和提供了一种简化和统一各种类型数据访问实现的方法。它可以很容易地利用统一各种类

4、型数据访问实现的方法。它可以很容易地利用几种现有的体系结构来访问数据,例如:几种现有的体系结构来访问数据,例如:p rad/原型原型p 客户端客户端/服务器服务器p 三层三层/多层体系结构多层体系结构p 智能客户端智能客户端linq从入门到精通天津理工大学华信软件学院 张一鸣启用启用linq的数据源的数据源ado.net linq技术技术c#其他其他vb.net语言集成查询语言集成查询linqlinqto datasetlinqto sqllinqto entitieslinqto objectslinqto xml启用启用linq的数据源的数据源ado.net linq技术技术对象对象关系关

5、系xmllinq从入门到精通天津理工大学华信软件学院 张一鸣net 2.0clrwinformswebservicesasp.netnet 3.0wcf wf wpfcardspacelinq ajaxrestnet 3.5.net 2.0是整个是整个.net的核心的核心.net3.0是在是在.net 2.0的基的基础上增加了础上增加了wpf、wcf、wf、cardspace等跟等跟vista有关的组件有关的组件.net 3.5除了包含除了包含.net 3.0的全部功能外,增加了对的全部功能外,增加了对linq、ajax等技术支持的等技术支持的全新框架库和编译器全新框架库和编译器linq从入门

6、到精通天津理工大学华信软件学院 张一鸣200820082007.112005.9linq从入门到精通天津理工大学华信软件学院 张一鸣原来的原来的sql只能访问包含在结构化的关系型数只能访问包含在结构化的关系型数据库中的数据。但是现实世界中,数据可以存储在据库中的数据。但是现实世界中,数据可以存储在各种各样的数据源中,比如数组、对象图、各种各样的数据源中,比如数组、对象图、xml文文档、数据库、文本文件、注册表项、网页、电子邮档、数据库、文本文件、注册表项、网页、电子邮件信息、简单对象访问协议(件信息、简单对象访问协议(soa p)消息内容、)消息内容、微软的微软的excel电子表等,特别是大量

7、非结构化数据,电子表等,特别是大量非结构化数据,都是用都是用sql无法访问的。无法访问的。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 ) console.writeline ( item );在在vs2008中

8、创建这个工程,编辑程序、编译、链接,执行,在中创建这个工程,编辑程序、编译、链接,执行,在具有三个元素的字符串数组执行具有三个元素的字符串数组执行linq 查询。显示结果为:查询。显示结果为:hello linqlinq从入门到精通天津理工大学华信软件学院 张一鸣每种数据源都有自己特有的数据访问模型。比每种数据源都有自己特有的数据访问模型。比如,查询数据库时,一般都使用如,查询数据库时,一般都使用sql,操纵,操纵xml数数据时,则使用文档对象模型据时,则使用文档对象模型mod或或xpath/xquery。使用不同的编程模型可以访问不同的数据源。但是使用不同的编程模型可以访问不同的数据源。但是

9、这造成程序员在编写程序时,当访问不同的数据源这造成程序员在编写程序时,当访问不同的数据源时,要采用不同的方法编写,增加了开发、调试和时,要采用不同的方法编写,增加了开发、调试和维护的工作量与复杂性。维护的工作量与复杂性。为了解决这个问题,软件界做了大量工作,尝为了解决这个问题,软件界做了大量工作,尝试把各种数据访问技术统一成一个综合的模型,如试把各种数据访问技术统一成一个综合的模型,如利用利用windows管理规范以管理规范以odbc访问访问excel等。等。linq从入门到精通天津理工大学华信软件学院 张一鸣linq在总结了以前的经验后,没有走统一各种不同在总结了以前的经验后,没有走统一各种

10、不同的数据模型的结构从而建立一个的数据模型的结构从而建立一个“通用通用”模型的方法,模型的方法,而是利用不同数据模型中操作具有的通用功能来实现而是利用不同数据模型中操作具有的通用功能来实现这个目的。这个目的。换句话说,使用换句话说,使用linq时,仍然维持现有的各种数据时,仍然维持现有的各种数据结构,比如类或表,并且不管这些数据类型表示何种结构,比如类或表,并且不管这些数据类型表示何种物理意义,但是都用统一的查询语法对异种数据进行物理意义,但是都用统一的查询语法对异种数据进行查询。例如对于内存中的数组和数据库中的关系表中查询。例如对于内存中的数组和数据库中的关系表中的数据,使用的数据,使用li

11、nq就可以对他们使用相同的查询语法。就可以对他们使用相同的查询语法。linq从入门到精通天津理工大学华信软件学院 张一鸣设计一个设计一个linq查询,在查询,在customers数据表中搜索所属国籍数据表中搜索所属国籍是意大利的那些公司的名称,代码如下所示:是意大利的那些公司的名称,代码如下所示:var query = from c in customers where c.country = “italy” select c.companyname;该查询返回的结果是一个字符串列表,可以用该查询返回的结果是一个字符串列表,可以用c#语句按照语句按照枚举的方式显示这些返回值,即:枚举的方式显示

12、这些返回值,即:foreach ( string name in query )console.writeline ( name ); linq从入门到精通天津理工大学华信软件学院 张一鸣1. var、query和和foreach都是标准的都是标准的c#3.0的的语句,分别表示执行的语句,分别表示执行的linq查询和对于对查询和对于对象的循环控制。在其中添加一个名为象的循环控制。在其中添加一个名为search.ascx的文件的文件2. c、customers是已定义的实体类。是已定义的实体类。3. from、where、select都是都是linq的关键字,的关键字,分别表示指定数据源、查找条

13、件和确定要查分别表示指定数据源、查找条件和确定要查找的数据内容。找的数据内容。linq从入门到精通天津理工大学华信软件学院 张一鸣上例中的上例中的customers可以是:可以是: 对象集对象集,例如:,例如:customer customers; 数据集中的数据集中的datatable,例如:,例如: dataset ds = getdataset( ); datatable customers = ds.tables“customers” ; 描述描述关系型数据库中物理表的实体类关系型数据库中物理表的实体类,例如:,例如: datacontext db = new datacontext

14、( connectionstring );); table customers = db.gettable();描述描述概念模型并被映射到关系型数据库中的实体类概念模型并被映射到关系型数据库中的实体类,例如:,例如: northwindmodel datamodel = new northwindmodel( ); objectquery customers = datamodel. customers;linq从入门到精通天津理工大学华信软件学院 张一鸣linq构件块构件块编程语言:编程语言: c# vb.net others标准查询操作符标准查询操作符查询表达式查询表达式表达式树表达式树l

15、inq提供器提供器linqto datasetlinqto sqllinqto entitieslinqto objectslinqto xml数据源数据源对象对象rdbmsxmldatasetado.netentity框架框架?otherslinq从入门到精通天津理工大学华信软件学院 张一鸣我们知道,在一般编程语言中执行我们知道,在一般编程语言中执行sql查询时,查询时,是把是把sql语句嵌入到程序中。这些语句嵌入到程序中。这些sql语句没有集语句没有集成到编程语言本身的语法和类型系统当中,因此编成到编程语言本身的语法和类型系统当中,因此编程和调试时都比较麻烦。程和调试时都比较麻烦。与与sq

16、l不同,不同,linq则是集成到开发语言当中的则是集成到开发语言当中的查询语言,而且它不仅局限于查询数据库,还可以查询语言,而且它不仅局限于查询数据库,还可以查询对象、实体、查询对象、实体、xml文档等非结构化的数据。文档等非结构化的数据。那么,那么,linq 是如何工作的呢是如何工作的呢?linq从入门到精通天津理工大学华信软件学院 张一鸣使用使用linq编写查询代码时,如下例:编写查询代码时,如下例:c#编译器会生成下列代码:编译器会生成下列代码:customer customers = getcustomers( );var query = from c in customers whe

17、re 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从入门到精通天津理工大学华信软件学院 张一鸣从上面的例子可见,首先在从上面的例子可见,首先在customers上调用

18、上调用where,然后在然后在where返回的对象上调用返回的对象上调用orderby进行排序,最后进行排序,最后在在orderby返回的对象上调用返回的对象上调用select。这是由使用的宿主。这是由使用的宿主语言(语言(c#)中的扩展方法()中的扩展方法(linq)在管理这种查询行为。)在管理这种查询行为。该例子中的查询调用的该例子中的查询调用的where、orderby、select方法方法的实现形式,取决于的实现形式,取决于customers的类型(即前述的对象集、的类型(即前述的对象集、数据表、关系型数据库中物理表的实体类、概念模型并被数据表、关系型数据库中物理表的实体类、概念模型并

19、被映射到关系型数据库中的实体类),同时也取决于相关的映射到关系型数据库中的实体类),同时也取决于相关的using语句指定的命名空间。扩展方法是语句指定的命名空间。扩展方法是linq使用的基础使用的基础语法特征,语法特征,linq就是采用这种相同的语法来操作不同的数就是采用这种相同的语法来操作不同的数据源。据源。linq从入门到精通天津理工大学华信软件学院 张一鸣linq查询只有在需要使用其返回结果时才会执行,否查询只有在需要使用其返回结果时才会执行,否则它不会被执行。例如,下面的例子中,仅当执行则它不会被执行。例如,下面的例子中,仅当执行foreach循环语句时才执行循环语句时才执行linq访

20、问:访问:var query = from c in customers (非冯结构)(非冯结构)foreach ( string name in query ) 迭代迭代linq查询返回结果并在内存中生成持久性数据副查询返回结果并在内存中生成持久性数据副本的方法也是这样:本的方法也是这样:var query = from c in customers (非冯结构)(非冯结构)list customers = query.tolist( ););linq从入门到精通天津理工大学华信软件学院 张一鸣 当当linq查询操作关系型数据库(比如查询操作关系型数据库(比如sql server)中)中的数

21、据时,它将生成等价的的数据时,它将生成等价的sql语句,而不会操作内存语句,而不会操作内存中的数据表的副本。中的数据表的副本。 并且,并且,linq对数据库的查询将被延迟,直至首次访问该对数据库的查询将被延迟,直至首次访问该查询结果为止。查询结果为止。 若前两个例子中,若前两个例子中,customers是是table类型类型(物理表)或(物理表)或objectquery类型(概念实类型(概念实体),在执行体),在执行foreach循环语句之前,或者在调用循环语句之前,或者在调用tolist方法之前,都不会把等价的方法之前,都不会把等价的sql查询发送到数据库。查询发送到数据库。linq从入门到

22、精通天津理工大学华信软件学院 张一鸣using system; using system.linq;using system.xml.linq;xelement books = xelement.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 ”);linq从入门到精通天

23、津理工大学华信软件学院 张一鸣var items = from book in books.elements (“book”) where (string) book. element (“author”)= “joe rattz” ; select book.element (“title”);foreach ( var title in titles ) console.writeline ( title.value ); 在在vs2008中创建这个工程,编辑程序、编译、链接,执行。中创建这个工程,编辑程序、编译、链接,执行。显示结果为:显示结果为:本例没有创建一个本例没有创建一个xmld

24、ocument,而是把,而是把xml数据解析为数据解析为xelment类型的对象,很方便的对类型的对象,很方便的对xml api进行了扩充。进行了扩充。pro linq: language integrated query in c# 2008linq从入门到精通天津理工大学华信软件学院 张一鸣using system; using system.linq; using system.data.linq;using nwind;northwind db = new northwind ( “data source = .sqlexpress; initial catalog= northwin

25、d” );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 );linq从入门到精通天津理工大学华信软件学院 张一鸣 本例代码要在工程中添加对本例代码要在工程中添加对system.data.linq.dll程程序集的引用。序集的引用。 添加添加using system.data.linq指令是为使用指令是为使用sql数数据库。据库。 添加添加using

26、nwind指令是为使用微软的指令是为使用微软的northwind示示例数据库,必须使用例数据库,必须使用sqlmetel命令行工具为目标数命令行工具为目标数据库生成实体类,这个生成的实体类被创建在据库生成实体类,这个生成的实体类被创建在nwind命名空间中。命名空间中。 本例的运行结果为:本例的运行结果为:hanari carnesque deliciaricardo adocicadoslinq从入门到精通天津理工大学华信软件学院 张一鸣本例演示了如何查询在本例演示了如何查询在northwind示例数据库中示例数据库中customers数据表以获得里约热内卢市(数据表以获得里约热内卢市( r

27、io de janeiro )的客户名称。)的客户名称。这段代码与现有的这段代码与现有的sql查询方法有明显的区别,其查查询方法有明显的区别,其查询操作被集成到编程语言中,使得开发者获得了语言级询操作被集成到编程语言中,使得开发者获得了语言级的支持。以前的支持。以前sql查询操作是写成一个命令字符串,直查询操作是写成一个命令字符串,直到运行该查询命令时才能检查语法错误。而本例中的到运行该查询命令时才能检查语法错误。而本例中的where语句需要用到语句需要用到customers数据表中的一个字段,数据表中的一个字段,开发者在编程时往往记不住字段的名字。但是因为开发者在编程时往往记不住字段的名字。

28、但是因为linq集成到语言中,智能感应根据代码中输入的集成到语言中,智能感应根据代码中输入的c,就可以自,就可以自动向开发者显示数据表的所有字段供挑选。动向开发者显示数据表的所有字段供挑选。linq从入门到精通天津理工大学华信软件学院 张一鸣语言集成是语言集成是linq的基本部分。其中最显而易见的部分的基本部分。其中最显而易见的部分是查询表达式特性。例如前面已经介绍的,我们把是查询表达式特性。例如前面已经介绍的,我们把lambda表达式构成的查询语句:表达式构成的查询语句:简写成查询表达式编写的代码:简写成查询表达式编写的代码:customer customers = getcustomers

29、( );ienumerablecustomer query = customers .where ( c = c.country = = “italy” ); .orderby ( c = c.name ) .select ( c = new c.name, c.city ;linq从入门到精通天津理工大学华信软件学院 张一鸣查询表达式编写的代码:查询表达式编写的代码:这样改写后,代码简洁,阅读容易。同时,由于这样改写后,代码简洁,阅读容易。同时,由于linq集成集成到编程语言(如到编程语言(如c#)中,可以在开发者编程时,就对写入的)中,可以在开发者编程时,就对写入的语句实时进行检查并提供智

30、能感应的信息提示。语句实时进行检查并提供智能感应的信息提示。这种简单的查询表达式检查和引导包括本地类型推断、扩展这种简单的查询表达式检查和引导包括本地类型推断、扩展方法、方法、lambda表达式、对象初始化表达式以及匿名类等。表达式、对象初始化表达式以及匿名类等。customer customers = getcustomers( );var query = from c in customers where c.country = = “italy” orderby c.name select new c.name, c.city ;linq从入门到精通天津理工大学华信软件学院 张一鸣下面的

31、例子展示了下面的例子展示了sql查询与等价的查询与等价的linq查询程序之间的差别:查询程序之间的差别:采用采用sql可编写下列代码:可编写下列代码:select * from customers where country = italy采用采用c#的的linq技术可编写下列代码:技术可编写下列代码:public list italiancustomers( customer customers ) list result = new list ( ); foreach ( customer c in customers ) if ( c.country = “italy” ) result

32、.add ( c ); return result;linq从入门到精通天津理工大学华信软件学院 张一鸣 在在sql查询中,表达的是需要什么,即从客户表中需要查询中,表达的是需要什么,即从客户表中需要查找出那些国家是意大利的客户记录来。而其返回的结查找出那些国家是意大利的客户记录来。而其返回的结果时一个长字符串,还需要大量的后期处理。果时一个长字符串,还需要大量的后期处理。 在在linq查询中,表达的是如何得到预期的结果,即专门查询中,表达的是如何得到预期的结果,即专门建立一个列表对象集合建立一个列表对象集合list,每当用,每当用linq语句从字符串数组语句从字符串数组customers 中

33、找到一个符合条件的中找到一个符合条件的客户名时,就用客户名时,就用add方法把它添加到结果对象集合中。方法把它添加到结果对象集合中。这样的语句语法更规范,结果更可用。这样的语句语法更规范,结果更可用。 linq查询用声明性结构取代了迭代的结构描述对数据的查询用声明性结构取代了迭代的结构描述对数据的操作让程序员的意图表达的更明确,使得程序更容易阅操作让程序员的意图表达的更明确,使得程序更容易阅读和维护,从而提高了开发效率。读和维护,从而提高了开发效率。linq从入门到精通天津理工大学华信软件学院 张一鸣语言集成的另外一个重要部分是类型检测。linq操作数据中,经常会遇到不同对象、变量的数据类型不

34、一致问题,这就有必要进行自动类型检测和变量间自动进行必要的类型转换。在.net编程语言中(如c#和vb),所有的数据都是强类型的,都支持这种类型检测,包括查询的集合和被读取或被返回的实体。这样就保证了诸如智能感知和重构等特性发挥效能。linq从入门到精通天津理工大学华信软件学院 张一鸣 .net framework的数据类型系统与的数据类型系统与sql server的的数据类型系统是有区别的,当使用数据类型系统是有区别的,当使用linq时,会优先时,会优先考虑考虑.net系统,因为它是任何承载系统,因为它是任何承载linq查询的语言查询的语言都支持的类型系统。可是大部分的数据都保留在关都支持的

35、类型系统。可是大部分的数据都保留在关系型数据库中,这样就必须对各种类型的数据进行系型数据库中,这样就必须对各种类型的数据进行大量的转换。大量的转换。 linq可以自动处理这两类数据类型系统之间的转换,可以自动处理这两类数据类型系统之间的转换,使类型系统中的这种差异几乎对程序员完全透明。使类型系统中的这种差异几乎对程序员完全透明。linq从入门到精通天津理工大学华信软件学院 张一鸣.net编程编程语言的数据语言的数据类型系统类型系统sql server的数据的数据类型系统类型系统界面界面自动转换自动转换linq从入门到精通天津理工大学华信软件学院 张一鸣linq是一项覆盖很多数据源的技术,其中有

36、些数据源集成在是一项覆盖很多数据源的技术,其中有些数据源集成在linq实现形式中,而这些实现形式是微软提供的实现形式中,而这些实现形式是微软提供的.net frame-work 3.5的组成部分,如下图所示:的组成部分,如下图所示:每个实现形式都通过扩展方法集进行定义,而扩展方法集需每个实现形式都通过扩展方法集进行定义,而扩展方法集需要的操作符来操作某一特殊的数据源,并由导入的命名空间控要的操作符来操作某一特殊的数据源,并由导入的命名空间控制对这些特性的访问。制对这些特性的访问。linqto datasetlinqto sqllinqto entitieslinqto objectslinqt

37、o xmllinq toado.netlinq从入门到精通天津理工大学华信软件学院 张一鸣 设计设计linq to objects的目的是操作对象集,对象可的目的是操作对象集,对象可以相互关联并形成一个图。从视图的角度来看,以相互关联并形成一个图。从视图的角度来看, linq to objects是是linq查询默认使用的实现形式。查询默认使用的实现形式。需要包括需要包括system.linq命名空间才能正常使用命名空间才能正常使用linq to objects。 linq to objects查询不仅局限于用户生成的数据集查询不仅局限于用户生成的数据集合,它还可以查询从操作系统或文件系统中抽

38、取的信合,它还可以查询从操作系统或文件系统中抽取的信息,或者其它类型的信息。下例演示了从文件系统抽息,或者其它类型的信息。下例演示了从文件系统抽取信息的取信息的linq查询。查询。linq从入门到精通天津理工大学华信软件学院 张一鸣本例演示如何对指定目录下的所有文件进行本例演示如何对指定目录下的所有文件进行linq查询,查询,找出所有大于找出所有大于10000字节的文件,并按照这些文件的容字节的文件,并按照这些文件的容量大小排序。量大小排序。string temppath = path.gettemppath ( );directoryinfo dirinfo = new directoryi

39、nfo ( temppath );var query = from f in dirinfo.getfiles ( ); where f.length 10000 orderby f.length descending select f;linq从入门到精通天津理工大学华信软件学院 张一鸣 linq to ado.netlinq to ado.net包括三种不同的、共享操作关系数包括三种不同的、共享操作关系数据必需信息的据必需信息的linqlinq实现形式:实现形式: linq to sqllinq to sql,用于处理,用于处理.net.net中自定义类型与物理表架构中自定义类型与物理表架

40、构间的映射。间的映射。 linq to entitieslinq to entities,很多方面与,很多方面与linq to sqllinq to sql类似,但它类似,但它不把物理数据库当作持久层使用,而是用概念性的实体不把物理数据库当作持久层使用,而是用概念性的实体数据模型(数据模型(entity data model, edmentity data model, edm)取代。返回结果)取代。返回结果是独立于物理数据层的抽象层。是独立于物理数据层的抽象层。 linq to datasetlinq to dataset,可实现使用,可实现使用linqlinq查询临时独立于物理查询临时独立

41、于物理数据库的内存数据表中的数据。数据库的内存数据表中的数据。linq从入门到精通天津理工大学华信软件学院 张一鸣linq to xml提供了一种操作提供了一种操作xml数据的、允许查询和数据操数据的、允许查询和数据操作的、略有区别的语法。而作的、略有区别的语法。而vb 2008在此基础上还提供了一种在此基础上还提供了一种支持支持linq to xml的特殊类型,即在该语言中包括的的特殊类型,即在该语言中包括的xml字面字面值。这种增强的支持可以简化操作值。这种增强的支持可以简化操作xml数据需要的代码。下面数据需要的代码。下面用用c#编写的查询可以用编写的查询可以用vb2008更简洁的方式表

42、示出来:更简洁的方式表示出来:dim book = new xelement ( “book”, new xattribute ( “title”, “programming linq” ); from person in team where person.role = “author” select new xelement ( “author”, person.name ) );linq从入门到精通天津理工大学华信软件学院 张一鸣 用用vb2008以更简洁的方式上述以更简洁的方式上述c#代码为:代码为:dim book = _ %= from person in team _ where

43、 person.role = “author” select % linq从入门到精通天津理工大学华信软件学院 张一鸣类型类型书名书名作者作者出版社出版社教材教材 精通精通linq程序设计程序设计paolo pialorsi等等清华大学出版社清华大学出版社参考参考 linqlinq高级编程高级编程scott klein清华大学出版社清华大学出版社参考参考linq技术详解技术详解c#2008版版joseph c rattz, jr.人民邮电出版社人民邮电出版社参考参考linq入门及应用入门及应用王的强等王的强等清华大学出版社清华大学出版社参考参考linq从基础到项目从基础到项目实战实战解本巨等解

44、本巨等化学工业出版社化学工业出版社相关网站:相关网站:http:/ 张一鸣本章主要介绍了本章主要介绍了linq,并简单介绍了它如何工作,并简单介绍了它如何工作,还使用了集成到还使用了集成到c#这样的主流编程语言中的统一语这样的主流编程语言中的统一语法,演示了查询和操作数据源。并且进一步介绍了法,演示了查询和操作数据源。并且进一步介绍了语言集成带来的优点,包括声明性编程、类型检测语言集成带来的优点,包括声明性编程、类型检测以及透明跨越不同的类型系统等。最后还简单介绍以及透明跨越不同的类型系统等。最后还简单介绍了在了在.net 3.5中可以使用的中可以使用的linq实现形式。实现形式。linq从入

45、门到精通天津理工大学华信软件学院 张一鸣 mobil-phone:e-mail: qq: 727940264因特网浏览linq从入门到精通天津理工大学华信软件学院 张一鸣webweb开发框架技术初级开发框架技术初级linq从入门到精通天津理工大学华信软件学院 张一鸣 本章主要是回顾和深入介绍本章主要是回顾和深入介绍c#中涉及的中涉及的linq基础基础知识知识, 包括泛型、匿名、包括泛型、匿名、lambda表达式表达式yield关键字、关键字、ienumerable接口等接口等 。委托委托对象初始化表达式对象初始化表达式匿名与匿名方法匿名与匿名方法lambda表达式表达

46、式泛型泛型扩展方法扩展方法枚举量和枚举量和yield查询表达式查询表达式linq从入门到精通天津理工大学华信软件学院 张一鸣 对于使用对于使用linqlinq查询来说查询来说, ,它完全依赖与它完全依赖与c#c#中新增的一些概念和特征中新增的一些概念和特征, ,因此可以说因此可以说, ,泛泛型等概念和特征是型等概念和特征是linqlinq技术的基础。本章技术的基础。本章将系统的介绍这些内容将系统的介绍这些内容, ,包括泛型、匿名、包括泛型、匿名、lambdalambda表达式、表达式、yieldyield关键字、关键字、ienumerienumer- -ableable接口等,为学生完全掌握接

47、口等,为学生完全掌握linqlinq技术打技术打好基础。好基础。 linq从入门到精通天津理工大学华信软件学院 张一鸣 c#调用方法时,可以向方法传递参数。这些参数分调用方法时,可以向方法传递参数。这些参数分为按值、按引用或按输出等类型。其中引用实际上为按值、按引用或按输出等类型。其中引用实际上就是原来变量即实参的别名,指向实参在内存中的就是原来变量即实参的别名,指向实参在内存中的位置,所以在方法中对引用类型参数的修改会导致位置,所以在方法中对引用类型参数的修改会导致对实参本身的改变。对实参本身的改变。 类似地,如果把方法也看成数据,通过类似地,如果把方法也看成数据,通过代理代理机制把机制把方

48、法赋值给一个变量,也就是把这个方法在内存中方法赋值给一个变量,也就是把这个方法在内存中的位置赋给变量,则通过这个变量就可以把这个方的位置赋给变量,则通过这个变量就可以把这个方法传递给其他的方法调用。这种类型的变量就是代法传递给其他的方法调用。这种类型的变量就是代理类型的变量。理类型的变量。linq从入门到精通天津理工大学华信软件学院 张一鸣 代理本身是一个类,它封装了一个或多个方法。在代理本身是一个类,它封装了一个或多个方法。在内部,一个代理保存方法指针(地址)的对照表,内部,一个代理保存方法指针(地址)的对照表,即这个代理类里面的每个方法名和它对应的地址的即这个代理类里面的每个方法名和它对应

49、的地址的列表。每个方法指针可以与一个引用实例配对,而列表。每个方法指针可以与一个引用实例配对,而该实例是包含实例方法的类实例。该实例是包含实例方法的类实例。 声明代理类型时在方法头前面放上关键字声明代理类型时在方法头前面放上关键字delegate,例如例如 : public delegate void printcallback ( int no);linq从入门到精通天津理工大学华信软件学院 张一鸣本例是文书自动回信的局部功能演示。根据输本例是文书自动回信的局部功能演示。根据输入的来信人姓名和性别,确定增加入的来信人姓名和性别,确定增加“先生先生”或或“女女士士”的称呼;根据处理来信时间,确

50、定增加的称呼;根据处理来信时间,确定增加“你你好好”、“上午好上午好”或或“下午好下午好”的问候语。这需要的问候语。这需要编制添加称呼词的两个方法和添加时间问候词的三编制添加称呼词的两个方法和添加时间问候词的三个方法。为了在主程序中使代码简洁清晰,不用个方法。为了在主程序中使代码简洁清晰,不用ifif语句分情况调用不同称呼词和问候语的办法,而是语句分情况调用不同称呼词和问候语的办法,而是采用两个代理分别表示添加的内容,问候语的区别采用两个代理分别表示添加的内容,问候语的区别通过代理的参数来解决。通过代理的参数来解决。linq从入门到精通天津理工大学华信软件学院 张一鸣using system;

51、 using system; namespace demodelegate1namespace demodelegate1 delegate void mydelegate delegate void mydelegate (string s); (string s);/无返回类型的代理,添加问候词无返回类型的代理,添加问候词 delegate string mydelegatestr (string s, booldelegate string mydelegatestr (string s, bool man);/ man);/有返回类型的代理,添加有返回类型的代理,添加称呼词称呼词cla

52、ss programclass program static void show1 (string s) static void show1 (string s) console.writeline console.writeline ( “ ( “你好,你好,0 0!”,s s);); static void show2 (string s)static void show2 (string s) console.writeline console.writeline ( “ ( “上午好,上午好,0 0!”,s s);); static void show3 (string s)stati

53、c void show3 (string s) console.writeline console.writeline ( “ ( “下午好,下午好,0 0!”,s s);); static string addtitle ( string s, boolstatic string addtitle ( string s, bool man ) man ) if ( man ) if ( man )return string.formatreturn string.format ( “ ( “你好,你好,0 0先生!先生!”,s s);); elseelsereturn string.form

54、atreturn string.format ( “ ( “你好,你好,0 0女士!女士!”,s s););linq从入门到精通天津理工大学华信软件学院 张一鸣 static void main ( string args ) string name = “林晚荣”; string name2 = “徐芷晴”; mydelegate del1 = new mydelegate(show1); console.writeline ( “.net代理调用” ); del1 (name);/代理调用,del1指向方法show1 console.writeline ( “*” ); console.w

55、riteline ( “多路代理绑定调用” ); del1 += show2;/代理del1在已绑定show1基础上又添加指向show2 del1 += show3;/代理del1在原基础上又添加指向show3 del1 (name);/代理调用,del1指向方法show1、show2、show3 console.writeline ( “n 合并掉show1代理调用” ); del1 -= show1;/代理del1现在仅指向show2、 show3 del1 (name);/代理调用,del1仅指向方法show2和show3 console.writeline ( “*” ); mydel

56、egate del2 = addtitle; console.writeline ( “返回带类型的绑定调用” ); console.writeline ( del2 ( name, true ) ); console.writeline ( del2 ( name2, false ) ); linq从入门到精通天津理工大学华信软件学院 张一鸣.net代理调用代理调用你好,林晚荣!你好,林晚荣!*多路代理绑定调用多路代理绑定调用你好,林晚荣!你好,林晚荣!上午好,林晚荣!上午好,林晚荣!下午好,林晚荣!下午好,林晚荣!*合并掉合并掉show1代理调用代理调用上午好,林晚荣!上午好,林晚荣!下午

57、好,林晚荣!下午好,林晚荣!*返回类型的代理调用返回类型的代理调用你好,林晚荣你好,林晚荣 先生!先生!你好,徐芷晴你好,徐芷晴 女士!女士!linq从入门到精通天津理工大学华信软件学院 张一鸣 本例是对一个有本例是对一个有1010个元素的整形数组,分别调用个元素的整形数组,分别调用三个不同的方法过滤选出其偶数、奇数和大于三个不同的方法过滤选出其偶数、奇数和大于5 5的数的的数的子集并显示。为了实现这个目的,一般是分别编写筛子集并显示。为了实现这个目的,一般是分别编写筛选偶数的方法选偶数的方法iseveniseven、筛选奇数的方法、筛选奇数的方法isoddisodd和筛选大和筛选大于于5 5

58、的数的方法的数的方法isover5isover5,然后在程序里分别调用它们,然后在程序里分别调用它们来实现要求。更简洁的办法是采用代理技术,设计一来实现要求。更简洁的办法是采用代理技术,设计一个代理类型个代理类型numpredicatenumpredicate和它的实例对象变量和它的实例对象变量even-even-predicatepredicate。在主程序每次。在主程序每次执行不同的任务时,都是调执行不同的任务时,都是调用同一个代理变量,只是分别给这个代理型变量赋值用同一个代理变量,只是分别给这个代理型变量赋值引用不同的方法。引用不同的方法。linq从入门到精通天津理工大学华信软件学院 张

59、一鸣iseveniseven、isoddisodd和和isover5isover5这三个方法都接收一这三个方法都接收一个整型参数个整型参数intint并判断是否满足条件,然后返回一并判断是否满足条件,然后返回一个布尔型逻辑值。为了解决对数组全部元素过滤挑个布尔型逻辑值。为了解决对数组全部元素过滤挑选的任务,又设计了一个方法选的任务,又设计了一个方法filterarrayfilterarray,它接,它接受待过滤的数组和代理类型受待过滤的数组和代理类型numpredicatenumpredicate的引用变的引用变量作为参数,并按照每次引用变量所指向的方法对量作为参数,并按照每次引用变量所指向的方法对数组进行具体的过滤操作。对每次选中的结果调用数组进行具体的过滤操作。对每次选中的结果调用方法方法displaylistdisplaylist全部显示出来。本例中采用了列全部显示出来。本例中采用了列表结构表结构listlist作为存放选中数组元素结果的保存结构。作为存放选中数组元素结果的保存结构。linq从入门到精通天津理工大学华信软件学院 张一鸣using system; using system.collection.genericusing system; using system.collection.generic; ;class delegatesclass delegate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论