LINQ基础
LINQ概述
LINQ(Language-Integrated Query,语言集成查询)是微软公司提供的一项新技术,它能够将查询直接引入到.Net Framework 所支持的编程语言(如C#和VB.NET等)中,可以为C#和Visual Basic提供强大的查询功能。LINQ查询操作可以通过编程语言自身传达,而不是以字符串形式嵌入到应用程序代码中。LINQ引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展,以支持几乎任何类型的数据模型。
LINQ是.Net Framework中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。LINQ主要由3部分组成,分别为LINQ to Objects、LINQ to ADO.NET和LINQ to XML。其中,LINQ to ADO.NET可以分为两部分,分别为LINQ to SQL和LINQ to DataSet。LINQ的组成说明如下。
▶ LINQ to SQL组件:可以查询基于关系数据库的数据,并对这些数据进行检索、插入、修改、删除、排序、聚合和分区等操作。
▶ LINQ to DataSet组件:可以查询DataSet对象中的数据,并对这些数据进行检索、过滤和排序等操作。
▶ LINQ to Objects组件:可以查询Ienumerable或Ienumerable<T>集合,也就是说可以查询任何可枚举的集合,如数据(Array和ArrayList)、泛型列表List<T>、泛型字典Dictionary<T>以及用户自定义的集合,而不需要使用LINQ提供程序或API。
▶ LINQ to XML组件:可以查询或操作XML结构的数据(如XML文档、XML片段和XML格式的字符串等),并提供了修改文档对象模型的内存文档和支持LINQ查询表达式等功能,处理XML文档的全新编程接口。
LINQ可以查询或操作任何存储形式的数,如对象(集合、数组、字符串等)、关系(关系数据库、ADO.NET数据集等)以及XML。LINQ架构如图所示。
LINQ查询
语言集成查询(LINQ)是一组技术的名称,这些技术建立在将查询功能直接集成到C#语言(以及Visual Basic和可能的任何其他.NET语言)的基础上。借助于LINQ,查询现在已是高级语言构造,就如同类、方法和事件等。
对于编写查询的开发人员来说,LINQ最明显的“语言集成”部分是查询表达式。查询表达式是使用C#中引入的声明性查询语法编写的。通过使用查询语法,开发人员可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作,使用相同的基本查询表达式模式来查询和转换SQL数据库、ADO.NET数据集、XML文档和流,以及.NET集合中的数据等。
使用LINQ查询表达式时,需要注意以下几点。
▶ 查询表达式可用于查询和转换来自任意支持LINQ的数据源中的数据。例如,单个查询可以从SQL数据库检索数据,并生成XML流作为输出。
▶ 查询表达式容易掌握,因为它们使用许多常见的C#语言构造。
▶ 查询表达式中的变量都是强类型的,但许多情况下不需要显式提供类型,因为编译器可以推断类型。
▶ 在循环访问foreach语句中的查询变量之前,不会执行查询。
▶ 在编译时,根据C#规范中设置的规则将查询表达式转换为“标准查询运算符”方法调用。任何可以使用查询语法表示的查询都可以使用方法语法表示,但是多数情况下查询语法更易读和简洁。
▶ 作为编写LINQ查询的一项规则,建议尽量使用查询语法,只在必须的情况下才使用方法语法。
▶ 一些查询操作,如Count或Max等,由于没有等效的查询表达式子句,因此必须表示为方法调用。
▶ 查询表达式可以编译为表达式目录树或委托,具体取决于查询所应用到的类型。其中,IEnumerable<T>查询编译为委托,IQueryable和IQueryable<T>查询编译为表达式目录树。
LINQ查询表达式包含8个基本子句,分别为from、select、group、where、orderby、join、let和into,其说明如表所示。
子 句 |
说 明 |
from |
指定数据源和范围变量 |
select |
指定当执行查询时返回的序列中的元素将具有的类型和形式 |
group |
按照指定的键值对查询结果进行分组 |
where |
根据一个或多个由逻辑“与”和逻辑“或”运算符(&&或||)分隔的布尔表达式筛选源元素 |
orderby |
基于元素类型的默认比较器按升序或降序对查询结果进行排序 |
join |
基于两个指定匹配条件之间的相等比较来连接两个数据源 |
let |
引入一个用于存储查询表达式中的子表达式结果的范围变量 |
into |
提供一个标识符,它可以充当对join、group或select子句的结果的引用 |