【IT168技术文档】
二十年之后,业界在面向对象 (OO) 编程技术的发展过程中趋于稳定。现在,程序员已经认为诸如类、对象和方法等特性是理所当然的。在探究当前的和下一代技术时,明显可以看出,有关编程技术的下一个难题是降低访问和集成特定信息(这些信息不是使用 OO 技术进行原始定义的)的复杂性。非 OO 信息的两个最常见源是关系数据库和 XML。
对于 LINQ 项目,我们采取了更为普通的方法,并向 .NET Framework 中添加了适用于所有信息源(而不只是关系数据或 XML 数据)的通用查询工具,而不是在编程语言和运行库中添加相关功能或特定于 XML 的功能。该工具名为 .NET 语言集成查询 (LINQ)。
我们使用语言集成查询 这一术语表明,该查询是开发人员主要编程语言(例如,C#、Visual Basic)的集成功能。语言集成查询使得查询表达式 能够得益于丰富的元数据、编译时语法检查、静态输入和智能感知(以前只能用于命令代码)。语言集成查询还允许将单个通用的声明查询工具应用于所有内存中信息,而不只是来自外部源的信息。
.NET 语言集成查询定义了一组通用的标准查询操作符,允许在任何基于 .NET 的编程语言中通过直接的声明方式进行遍历、筛选和投影操作。标准查询操作符允许将查询应用于任何基于 IEnumerable 的信息源。LINQ 允许第三方使用特定于域的新操作符(适用于目标域或技术)来补充标准查询操作符集。更重要的是,第三方还可以使用自己提供附加服务(例如,远程计算、查询转换、优化等)的实现来自由替换标准查询操作符。通过符合 LINQ 样式 的约定,此类实现可以享受与标准查询操作符相同的语言集成和工具支持。
查询体系结构的可扩展性在 LINQ 项目本身中用于提供可同时处理 XML 和 SQL 数据的实现。处理 XML 的查询操作符 (XLinq) 使用一个高效、易于使用的内存中 XML 工具来提供宿主编程语言中的 XPath/XQuery 功能。处理关系数据的查询操作符 (DLinq) 将基于 SQL 的架构定义集成构建到 CLR 类型系统中。该集成通过关系数据提供强类型化,同时直接在底层存储中保留关系模型的表达功能和查询计算的性能。
返回页首
标准查询操作符简介
为了查看执行中的语言集成查询,我们将从一个简单的 C# 3.0 程序开始,该程序使用标准的查询操作符来处理数组的内容:
如果您编译并运行该程序,将看到以下输出:using System; using System.Query; using System.Collections.Generic; class app { static void Main() { string[] names = { "Burke", "Connor", "Frank", "Everett", "Albert", "George", "Harris", "David" }; IEnumerable expr = from s in names where s.Length == 5 orderby s select s.ToUpper(); foreach (string item in expr) Console.WriteLine(item); } }
要了解语言集成查询如何工作,我们需要剖析该程序的第一个语句。BURKE DAVID FRANK
使用一个查询表达式 初始化局部变量 expr。通过应用一个或多个标准查询操作符或特定于域的操作符,查询表达式可以操作一个或多个信息源。该表达式使用了三个标准查询操作符:Where、OrderBy 和 Select。IEnumerable expr = from s in names where s.Length == 5 orderby s select s.ToUpper();
Visual Basic 9.0 也支持 LINQ。以下是以 Visual Basic 9.0 编写的上述语句:
这里显示的 C# 和 Visual Basic 语句均使用查询语法。与 foreach 语句一样,查询语法是一个方便的声明性代码缩写,您可以手动编写它。上述语句在语义上与以下所示的以 C# 编写的显式语法完全相同:Dim expr As IEnumerable(Of String) = _ Select s.ToUpper() _ From s in names _ Where s.Length = 5 _ Order By s
Where、OrderBy 和 Select 操作符的参数称为 λ 表达式,它们是类似于委托的代码片段。它们允许将标准查询操作符单独定义为方法,并使用点标记串连在一起。这些方法共同构成了可扩展查询语言的基础。IEnumerable expr = names .Where(s => s.Length == 5) .OrderBy(s => s) .Select(s => s.ToUpper());