1、 20.1 概述概述 20.2 基于基于LINQ的简单查询的简单查询 20.3 标准查询操作符标准查询操作符 20.4 LINQ to SQL 20.5 小结小结20.1 概述概述LINQ提供了一种类似于提供了一种类似于SQL的轻量级查询的轻量级查询语法,以实现对底层数据的访问功能,可语法,以实现对底层数据的访问功能,可以查询由高级语言构造的类、方法和事件以查询由高级语言构造的类、方法和事件等,而且等,而且LINQ也提供了对数据库和也提供了对数据库和XML的的查询支持。查询支持。查询表达式指的是一组指令,这些指令描查询表达式指的是一组指令,这些指令描述要从一个或多个指定数据源检索的数据,述要从
2、一个或多个指定数据源检索的数据,以及返回的数据应使用的格式。以及返回的数据应使用的格式。20.2 基于LINQ的简单查询20.2.1 简单简单LINQ查询查询所有所有LINQ查询操作都由查询操作都由3个不同的操作组成,分别是获取数据源、个不同的操作组成,分别是获取数据源、创建查询和执行查询。创建查询和执行查询。最基本的查询由关键字最基本的查询由关键字form、where和和select组成。组成。示例:示例:static void Main()int scores=new int 88,89,100,51,23,92,81,60;IEnumerable scoreQuery=from scor
3、e in scores where score 70 select score;foreach(int i in scoreQuery)Console.Write(i+);20.2.2 LINQ的用途LINQ不仅可以用于检索数据,而且可以进行数据不仅可以用于检索数据,而且可以进行数据转换。通过转换。通过LINQ查询,可以将源序列用作输入,查询,可以将源序列用作输入,以多种形式创建新输出序列,具体方式如下。以多种形式创建新输出序列,具体方式如下。将多个输入序列合并到具有新类型的单个输出序列中。将多个输入序列合并到具有新类型的单个输出序列中。创建其元素只包含源序列中元素的一个或几个属性的创建其元素
4、只包含源序列中元素的一个或几个属性的输出序列。输出序列。创建其元素包含对源数据执行的操作结果的输出序列。创建其元素包含对源数据执行的操作结果的输出序列。创建不同格式的输出序列,例如可以将创建不同格式的输出序列,例如可以将SQL行或文本行或文本文件的数据转换为文件的数据转换为XML。20.2.3 LINQ的推迟查询示例:示例:static void Main()List Cities=new List Shanghai,Beijing,Xiamen,Qingdao,Xian;var CityWithS=from c in Cities where c.StartsWith(S)orderby c
5、 select c;Console.WriteLine(第一次查询名称以第一次查询名称以S起始的城市起始的城市);foreach(string city in CityWithS)Console.WriteLine(city);Console.WriteLine();Cities.Add(Shenzhen);Cities.Add(Shenyang);Console.WriteLine(第二次查询名称以第二次查询名称以S起始的城市起始的城市);foreach(string city in CityWithS)Console.WriteLine(city);20.3 标准查询操作符where、or
6、derby和和select是是LINQ较为常见的查较为常见的查询操作符询操作符 其他有:其他有:group by、Count、Sum、Min、Max、Average、Distinct、join。where子句子句:使用:使用where子句,可以通过多个表子句,可以通过多个表达式限定过滤条件,表达式之间通过达式限定过滤条件,表达式之间通过“&”和和“|”来连接,表达式的结果类型必须是来连接,表达式的结果类型必须是bool型。型。orderby子句子句:可以使用:可以使用orderby子句,按照其子句,按照其后的属性进行升序排列。如要对序列进行降序排后的属性进行升序排列。如要对序列进行降序排列,可
7、以在语句后面添加列,可以在语句后面添加descending。20.3 标准查询操作符group by子句:如果要根据一个值对查询子句:如果要根据一个值对查询结果进行分组,可以使用结果进行分组,可以使用group by子句。子句。如果要检索分组后的结果,可以使用如果要检索分组后的结果,可以使用into子子句。句。合计操作符合计操作符:诸如:诸如Count()、Sum()、Min()、Max()、Average()的合计操作符不的合计操作符不返回一个集合,而是返回一个值。返回一个集合,而是返回一个值。20.3 标准查询操作符Distinct运算符负责从集合中删除重复的元运算符负责从集合中删除重复的
8、元素。素。join子句用于连接两个集合,查询表达式语子句用于连接两个集合,查询表达式语法为法为joininon equals。20.4 LINQ to SQL20.4.1 LINQ to SQL简单应用简单应用LINQ to SQL体系结构由体系结构由3层组成,包括应层组成,包括应用程序层、用程序层、LINQ to SQL层和层和SQL Server数据库层。应用程序通过数据库层。应用程序通过LINQ to SQL来来访问数据库,其访问的原理就是将数据库访问数据库,其访问的原理就是将数据库中的表映射为一个类。中的表映射为一个类。20.4.1 LINQ to SQL简单应用简单应用为了使类能够操
9、作数据库,必须使用为了使类能够操作数据库,必须使用DataContext类建立与数据库之间的连接,类建立与数据库之间的连接,DataContext类用于从数据库检索对象和提交更类用于从数据库检索对象和提交更改的主要通道,它主要负责如下功能。改的主要通道,它主要负责如下功能。将将C#语句中的查询转换为语句中的查询转换为SQL语句。语句。执行查询。执行查询。管理数据库连接,这样开发人员就不必编写管理数据库连接,这样开发人员就不必编写Connection对象,也不必关心连接的打开和释放问题。对象,也不必关心连接的打开和释放问题。例如下列代码。例如下列代码。string strconn=Data So
10、urce=localhost;Initial Catalog=stuinfo;Persist Security Info=false;User Id=admin;Password=123;DataContext db=new DataContext(strconn);20.4.2 O/R设计器 除了手工编写代码使数据库表映射成为实除了手工编写代码使数据库表映射成为实体类,体类,Visual Studio 2008还提供了一个还提供了一个O/R设计器(对象关系设计器)来将数据库设计器(对象关系设计器)来将数据库中的表映射成实体类。中的表映射成实体类。20.4.3 使用LINQ to SQL类访问
11、数据库修改操作修改操作:在通过在通过DataContext对象修改数据库时,对象修改数据库时,需要调用需要调用DataContext对象的对象的SubmitChanges()方法,该方法负责将所有修改同步至数据库中。方法,该方法负责将所有修改同步至数据库中。删除操作删除操作:在通过在通过DataContext删除数据库的某些删除数据库的某些数据时,需要调用数据时,需要调用Table对象的对象的DeleteOnSubmit()方法和方法和DataContext对象的对象的SubmitChanges()方法。其中,方法。其中,DeleteOnSubmit()方法负责将方法负责将Table对象中某对
12、象中某些记录的状态设置为删除状态,些记录的状态设置为删除状态,SubmitChanges()方法负责将方法负责将Table中修改同中修改同步至数据库中。步至数据库中。20.4.3 使用LINQ to SQL类访问数据库添加操作添加操作:在通过在通过DataContext向数据库添向数据库添加数据时,需要调用加数据时,需要调用Table对象的对象的InsertOnSubmit()方法和方法和DataContext对对象的象的SubmitChanges()方法。其中,方法。其中,InsertOnSubmit()方法负责将记录添加至方法负责将记录添加至Table对象中,对象中,SubmitChang
13、es()方法负责方法负责将将Table中所发生的修改同步至数据库中。中所发生的修改同步至数据库中。20.5 小结 本章重点介绍了本章重点介绍了LINQ to Objects和和LINQ to SQL。通过本章的学习,可以了解。通过本章的学习,可以了解LINQ的强大功能,即简化查询,且针对的强大功能,即简化查询,且针对不同的底层数据源均采用统一的查询语法,不同的底层数据源均采用统一的查询语法,使开发人员可以从繁琐的技术细节中解脱使开发人员可以从繁琐的技术细节中解脱出来,更加关注项目的逻辑。尤其是出来,更加关注项目的逻辑。尤其是LINQ to SQL的出现,大大降低了数据库的出现,大大降低了数据库应用程序的开发门槛,大大提高了数据库应用程序的开发门槛,大大提高了数据库应用程序的开发效率。应用程序的开发效率。