[推荐]语言集成查询LINQ入门篇
语言集成查询LINQ入门篇
作者:Jacky.zhou
时间:2009/06/04
LINQ简介
语言集成查询 (LINQ) 是 Visual Studio 2008 中的一组功能,可为 C# 和 Visual Basic 语言语法提供强大的查询功 能。LINQ 引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存 储。Visual Studio 2008 包含 LINQ 提供程序的程序集,这些程序集支持将 LINQ 与 .NET Framework 集合、SQL Server 数据库、ADO.NET 数据集和 XML 文档一起使用。
传统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须 针对以下各种数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。LINQ 使查询成为 C# 和 Visual Basic 中的一等语言构造。您可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。下图显示 了一个用 C# 语言编写的、不完整的 LINQ 查询,该查询针对 SQL Server 数据库,并具有完全类型检查和 IntelliSense 支持。
在 Visual Studio 中,可以用 Visual Basic 或 C# 为以下各种数据源编写 LINQ 查询:SQL Server 数据库、XML 文 档、ADO.NET 数据集以及支持 IEnumerable 或泛型 IEnumerable(T) 接口的任意对象集合。此外,还计划了对 ADO.NET Entity Framework 的 LINQ 支持,并且第三方为许多 Web 服务和其他数据库实现编写了 LINQ 提供程序。
LINQ 查询既可在新项目中使用,也可在现有项目中与非 LINQ 查询一起使用。唯一的要求是项目应面向 .NET Framework 3.5 版。
LINQ 查询简介
查询是一种从数据源检索数据的表达式。查询通常用专门的查询语言来表示。随着时间的推移,人们已经为各种数 据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。因此,开发人员不得不针对他们 必须支持的每种数据源或数据格式而学习新的查询语言。LINQ 通过提供一种跨各种数据源和数据格式使用数据的一 致模型,简化了这一情况。在 LINQ 查询中,始终会用到对象。可以使用相同的基本编码模式来查询和转换 XML 文 档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据。
所有 LINQ 查询操作都由以下三个不同的操作组成:
1. 获取数据源。
2. 创建查询。
3. 执行查询。
何其他格式的数据。
下面的示例演示如何用源代码表示查询操作的三个部分。为了方便起见,此示例将一个整数数组用作数据源; 但其中涉及的概念同样适用于其他数据源。本主题的其余部分也会引用此示例:
2 {
3 static void Main()
4 {
5 // The Three Parts of a LINQ Query:
6 // 1. Data source.
7 int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
8
9 // 2. Query creation.
10 // numQuery is an IEnumerable<int>
11 var numQuery =
12 from num in numbers where (num % 2) == 0 select num;
13
14 // 3. Query execution.
15 foreach (int num in numQuery)
16 {
17 Console.Write("{0,1} ", num);
18 }
19 }
20 }
21
22
数据源
在上一个示例中,由于数据源是数组,因此它隐式支持泛型 IEnumerable(T) 接口。这一事实意味着该数据源 可以用 LINQ 进行查询。在 foreach 语句中执行查询,而 foreach 要求使用 IEnumerable 或 IEnumerable (T)。支持 IEnumerable(T) 或派生接口(如泛型 IQueryable(T))的类型称为“可查询类型”。
可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。如果源数据还没有作为可查询类型出现在内 存中,则 LINQ 提供程序必须以此方式表示源数据。例如,LINQ to XML 将 XML 文档加载到可查询的 。
2 // using System.Xml.Linq;
3 XElement contacts = XElement.Load(@"c:\myContactList.xml");
在 LINQ to SQL 中,首先手动或使用 对象关系设计器(O/R 设计器) 在设计时创建对象关系映射。针对这些 对象编写查询,然后由 LINQ to SQL 在运行时处理与数据库的通信。在下面的示例中,Customer 表示数据库 中的特定表,并且 Table<Customer> 支持派生自 IEnumerable(T) 的泛型 IQueryable(T) 接口。
2 // using System.Data.Linq;
3 DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");
有关如何创建特定类型的数据源的更多信息,请参见各种 LINQ 提供程序的文档。但基本规则非常简单:LINQ
数据源是支持泛型 IEnumerable(T) 接口或从该接口继承的接口的任意对象。
注意:
支持非泛型 IEnumerable 接口的类型(如 ArrayList)也可用作 LINQ 数据源。有关更多信息,请参见如 何:使用 LINQ 查询 ArrayList。
查询
查询指定要从数据源中检索的信息。查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。为使编写查询的工作变得更加容易,C# 引入了新的查 询语法。
上一个示例中的查询从整数数组中返回所有偶数。该查询表达式包含三个子句:from、where 和 select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。) from 子句指定数据源,where子句应用筛选器,select 子句指定返回的元素的类型。LINQ 查询表达式(C# 编程指南)一节中详细讨论了这些子句和其他查询子句。目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。有关在幕后是如何构建查询的更多信息。