在 C# 中使用 LINQ

更新:2007 年 11 月

应用程序经常使用 SQL 数据库或 XML 文档中的数据。传统上,开发人员必须学习一种主编程语言,如 C#,以及一种辅助语言,如 SQL 或 XQuery。语言集成查询 (LINQ) 将查询功能引入 C# 语言本身。现在,您可以将 C# 知识与其他一些关键字和概念一同使用来查询 SQL 数据库、ADO.NET 数据集、XML 文档以及任何实现 IEnumerable 接口的 .NET 集合类,而不需要学习一种独立的查询语言。

使用 LINQ 的优点

  • 熟悉的查询编写语法。

  • 针对语法错误和类型安全的编译时检查。

  • 改进的调试器支持。

  • IntelliSense 支持。

  • 直接处理 XML 元素的功能,而不是像 W3C DOM 那样需要创建容器 XML 文档。

  • 强大的内存中 XML 文档修改功能,比 XPath 或 XQuery 更容易使用。

  • 强大的筛选、排序和分组功能。

  • 用于跨多种数据源和数据格式处理数据的一致模型。

支持 LINQ 的 C# 语言增强功能

下面是添加到 C# 3.0 以支持 LINQ 的一些新语言结构:

语言结构

说明

查询表达式

用于从任何支持 LINQ 的数据源中查询数据的声明性查询语法。有关更多信息,请参见LINQ 查询表达式(C# 编程指南)支持 LINQ 的 C# 3.0 功能

隐式类型化变量

一个由修饰符 var 指定的变量,它使编译器可以推断变量的类型。有关更多信息,请参见隐式类型的局部变量(C# 编程指南)支持 LINQ 的 C# 3.0 功能

对象初始值设定项

支持在不显式调用对象的构造函数的情况下初始化对象。有关更多信息,请参见对象和集合初始值设定项(C# 编程指南)支持 LINQ 的 C# 3.0 功能

匿名类型

使编译器能够在不需要您指定命名数据类型的情况下创建对象。类型名称只可用于编译器。有关更多信息,请参见匿名类型(C# 编程指南)支持 LINQ 的 C# 3.0 功能

扩展方法

支持通过使静态方法与类型关联来扩展任何现有类型。有关更多信息,请参见支持 LINQ 的 C# 3.0 功能

lambda 表达式

一个内联表达式或语句块,可在需要委托类型的任何地方使用。

有关更多信息,请参见 Lambda 表达式(C# 编程指南)支持 LINQ 的 C# 3.0 功能

编写 LINQ 查询

无论您是使用 ADO.NET 数据集、SQL 数据库、.NET 集合,还是使用 XML 文档,LINQ 查询表达式的基本结构都是相同的。查询表达式以 from 子句开始,后跟查询子句,如 where、orderby、select,等等。完整的表达式存储在查询变量中,可执行或修改任意次。查询表达式语法与 SQL 的语法类似。例如,通过使用下面的语法,您可以编写一个 LINQ 查询,返回 students 数据库中所有主修 science 的学生:

IEnumerable<Student> studentQuery =

from student in studentApp.students

where student.Major == "Science"

select student;

若要了解有关查询表达式的更多信息,请参见基本查询操作 (LINQ)LINQ 查询介绍演练:在 C# 中编写查询 (LINQ)

LINQ to Objects

短语 LINQ to Objects 表示使用 LINQ 查询内存中的数据集合,如 System.CollectionsSystem.Collections.Generic 命名空间中的类。这些类包括 ArrayListList<T>Dictionary<K,T>,等等。您可以查询数组,因为它们隐式支持 IEnumerable<T>。有关更多信息,请参见 LINQ to Objects

您甚至可以将文本文件导入到可枚举数据结构,并运行查询对其内容进行筛选或排序。有关示例,请参见如何:对某词在字符串中出现的次数进行计数 (LINQ)

LINQ to SQL

使用 LINQ to SQL 可通过强类型对象层访问 SQL Server 和 SQL Server Express 数据库,该强类型对象层是您使用 O/R 设计器创建的。

您可以使用 O/R 设计器将 LINQ to SQL 类映射到数据库中的表,然后编写 LINQ 查询将数据绑定到您的应用程序中的控件。例如,下面的 LINQ 查询将一个 LINQ 查询的结果(来自美国的所有客户)绑定到 DataGridView 控件的绑定源。

var CustomersQuery = from customers in northwindSampleDataContext1.Customers
                      where customers.Country == "US"
                      select customers;
customerBindingSource.DataSource = CustomersQuery;

有关更多信息,请参见 LINQ to SQLO/R 设计器概述演练:创建 LINQ to SQL 类(O/R 设计器)如何:向项目中添加 LINQ to SQL 类(O/R 设计器)

Bb655883.alert_note(zh-cn,VS.90).gif说明:

O/R 设计器当前不支持 SQL Server Compact 3.5 数据库。有关如何获取 SQL Server Express Edition 的信息,请参见如何:安装示例数据库中的“获取 SQL Server Express Edition”部分。

LINQ to DataSet

DataSet 用于将数据绑定到应用程序中的控件。DataSet 使应用程序可以使用脱机(缓存)数据或多个数据源的子集,而不是直接连接到数据库。当应用程序联机时,DataSet 的更改可以更新到数据库中。

LINQ to Dataset 使基于缓存数据的查询比 DataSet 使用的筛选和排序方法更加快速和简单。有关更多信息,请参见 LINQ to DataSet

LINQ to XML

LINQ to XML 使您可以使用 LINQ 查询表达式轻松地创建和修改 XML 文件,而非使用 XPath 或 XQuery。LINQ to XML 是新的内存中 XML 编程 API,它使用现代编程构造,而不是 W3C 文档对象模型 (DOM)。有关更多信息,请参见 LINQ to XML 与 DOMLINQ to XMLLINQ to XML 类概述

请参见

概念

入门 (LINQ to SQL)

其他资源

C# 中的 LINQ 入门

入门 (LINQ to DataSet)

入门 (LINQ to XML)