1、本章简单介绍LINQ的概念、LINQ的设计目标以及LINQ的分类,通过3个使用LINQ的实例引领读者开始LINQ的学习。本章使用的实例代码运用了大量C#3.0语言的新特性,如对象和集合初始化器以及扩展方法等。读者在学习本章内容时,可不必太在意这些细节,将学习重点放在对LINQ的整体把握方面。1.1 什么是LINQ1.2 LINQ设计目标 1.3 LINQ的种类 1.4 LINQ应用实例 1.1 什么是LINQLINQ是Language Integrated Query的缩写,翻译成中文就是语言集成查询。LINQ是一系列的编程接口,借助于LINQ技术,可以使用一种统一的方式查询各种不同类型的数据
2、。LINQ是微软公司在Visual Studio 2008和.NET Framework 3.5版本中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。LINQ通过使用特定的语法,可以对数据库、对象以及XML等多种类型的数据进行查询操作。LINQ既可在新项目中使用,也可在现有项目中与非LINQ查询一起使用,唯一的要求是项目应面向.NET Framework 3.5版本。1.2 LINQ的设计目标LINQ采用一种开放性的设计架构,这种开放性不仅表现在其可以被多种.NET语言所支持,还表现在通过为不同类型的数据源开发相应的LINQ Provider,LINQ可以在各种类型的数据源之间提供
3、一个统一的访问接口。1.2 LINQ的设计目标LINQ的设计模型图 LINQ to OBJECT LINQ to ADO.NET LINQ to XML LINQ to OBJECT是用来访问对象集合的编程接口,对象集合里面的元素之间可以具有层次结构。在.NET中支持列举操作的各种对象类型,基本上都可以使用LINQ to OBJECT来进行操作。例如,可以使用LINQ to OBJECT来对一个整数类型数组中所有元素进行排序,也可以在一个自定义类型的集合中找出符合某些条件的元素子集合。下面的代码实现了将一个整数类型数组numbers中所有元素按照从小到大的顺序排列,并放入集合items中的逻辑
4、。/将一个整数类型数组numbers中所有元素按照从小到大的顺序排列,并放入集合items中using System;using System.Collections.Generic;using System.Text;using System.Linq;namespace Sample public class Test static void Main(string args)/使用集合初始化器初始化整数类型数组numbers int numbers=10,6,8,4,9,2,1,5,0;var items=from s in numbers orderby s select s;/输出结
5、果 foreach(var item in items)Console.WriteLine(item);LINQ to ADO.NET是用来访问关系模型数据的编程接口,其可以进一步分为LINQ to SQL、LINQ to Entities和LINQ to DataSet这3个子类别,每个子类别针对特定的关系模型数据。其中,LINQ to SQL在.NET自定义类型(class)和数据库的物理表之间建立映射,通过操作自定义类型从而实现对数据库物理表的操作;LINQ to Entities与LINQ to SQL有相似之处,但是LINQ to Entities并不是直接在数据库物理表和自定义类型
6、之间建立映射,而是采用了一个概念上的实体数据模型,这项技术目前还在持续的研发中,本书将不会涉及到LINQ to Entities的内容;LINQ to DataSet是使用LINQ来访问DataSet的接口。下面的代码实现了使用LINQ to SQL向数据库物理表中添加一条记录的逻辑。/使用LINQ to SQL向数据库物理表中添加一条记录Book book=new Book();/生成一个实体类对象book.BOOKID=99;book.Book_Name=C#程序设计;book.Book_Author=张三;BookDataContext ctx=new BookDataContext()
7、;/只要与数据库通信,BookDataContext对象必不可少ctx.Book.InsertOnSubmit(book);/将需要修改的对象添加到BookDataContext对象中ctx.SubmitChanges();/通过BookDataContext对象将修改保存到数据库XML LINQ to XML是用来访问XML数据的编程接口,XML目前已经成为被各种开发平台所支持的一种数据标准。关于XML,存在着各种各样的规格和模型,具体如下。XML Schema Definition(XSD):用来定义XML文档的结构。Extensible Stylesheet Language for T
8、ransformations(XSLT):将XML文档在不同的结构间转换。Document Object Model(DOM):用来管理在内存中的XML文档。Simple Object Access Protocol(SOAP):使用XML来实现平台间的互操作性。XML 下面的代码实现了使用LINQ to XML创建一个XML元素的逻辑。/使用LINQ to XML创建一个XML元素Books=new XElement(Books,new XElement(Book001,new XElement(Title,C程序设计),new XElement(Author,谭浩强),new XEleme
9、nt(Book002,new XElement(Title,算法与数据结构),new XElement(Author,张浩);本节将通过3个分别使用LINQ to OBJECT、LINQ to SQL和LINQ to XML的实例,初次体验LINQ的强大功能以及使用LINQ的简单与高效。实例1-1将通过一个C#控制台应用程序来展示如何使用LINQ操作对象集合。运行Visual Studio 2008,新建项目,在打开的【新建项目】窗口的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【控制台应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Frame
10、work 3.5】平台类型,如图所示。【新建项目】窗口单击【确定】按钮后,在打开的Program.cs文件中输入下面的代码。/LINQ to OBJECT实例代码using System;using System.Collections.Generic;using System.Linq;/使用Linq需引入的命名空间using System.Text;namespace sample1_1 class Program static void Main(string args)/使用集合初始化器构造一个数组greetings string greetings=hello,hello LINQ,
11、how are you ;/使用var声明一个局部变量items,变量类型自动识别 var items=from s in greetings /Linq关键字from、where和select where s.Length 10 /找出长度大于10的元素 select s;/输出满足条件的所有字符串 foreach(var item in items)Console.WriteLine(item);/为了方便看到输出结果 Console.ReadLine();实例1-2将通过一个C#Windows窗体应用程序来展示如何使用LINQ to SQL对数据库中的物理表进行操作。运行Visual S
12、tudio 2008,新建项目,在打开的【新建项目】窗口的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【Windows窗体应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Framework 3.5】平台类型,如图所示。【新建项目】窗口单击【确定】按钮,打开Visual Studio 2008窗体设计器窗口,在打开的窗体中添加4个Button控件,控件名称分别为QueryButton、AddButton、ModifyButton和DeleteButton;然后向窗体添加一个DataGridView控件,控件名称为BookDataGridView。
13、窗体布局如图所示。窗体布局实例1-3将通过一个C#Windows窗体应用程序来展示如何使用LINQ对XML数据进行操作。运行Visual Studio 2008,新建项目,在打开的【新建项目】窗口中的【项目类型】列表框中选择【Visual C#】,在【模板】列表框中选择【Windows窗体应用程序】。注意,在【新建项目】窗口右上角的下拉列表框中选择【.NET Framework 3.5】平台类型,如图所示。【新建项目】窗口单击【确定】按钮,打开Visual Studio 2008窗体设计器窗口,在打开的窗体中添加4个Button控件,控件名称分别为CreateXmlButton、ModifyXmlButton、SaveXmlButton和OpenXmlButton;然后向窗体添加一个TextBox控件,控件名称为XmlTextBox。窗体布局如图所示。窗体布局