更新: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.Collections 和 System.Collections.Generic 命名空间中的类。这些类包括 ArrayList、List<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 SQL、O/R 设计器概述、演练:创建 LINQ to SQL 类(O/R 设计器)和如何:向项目中添加 LINQ to SQL 类(O/R 设计器)。
![]() |
---|
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 与 DOM、LINQ to XML 和 LINQ to XML 类概述。