Sunday, May 06, 2007

LINQ,.NET语言级集成查询能力(.NET Language Integrated Query)

1 NET语言级集成查询能力(.NET Language Integrated Query


(原文:The LINQ Project, .NET Language Integrated Query



经过了最近20年,面向对象编程技术(object-oriented (OO) programming technologies)在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据(accessing and integrating information)的复杂度的问题。其中两个最主要访问的数据源与数据库(database)和XML相关。


LINQ提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源(all sources of information)的具有多种用途(general-purpose)的语法查询特性(query facilities),这是比向开发语言和运行时(runtime)添加一些关系数据(relational)特性或者类似XML特性(XML-specific)更好的方式。这些语法特性就叫做.NET Language Integrated Query (LINQ)


.NET Language Integrated Query定义了一组多用途的标准查询操作符(standard query operators),可以在任何一种基于.NET平台的开发语言(.NET-based programming languagequery operators)中用一些简洁明了的语法就可以做到像访问、过滤、发送数据这样一些操作。


LONQ项目使用的可扩展的查询体系架构,可以提供同时处理XML数据和SQL数据的实现。基于XML (XLinq)的查询操作符使用一种高效率的,易使用的,并且在内存中处理的XML语法,如在主程序设计语言中使用的XPath/XQuery这样的功能。基于关系数据(Dlinq)的查询操作符即建立在综合查询语言(SQL-Based)语法基础上的语法,则直接定义在CLR类型库系统(CLR type system)中。



1.1 标准查询语法介绍


下面用一段C# 3.0的程序来介绍标准查询语法是如何使用的,该程序使用标准查询操作符处理一个 array 的数据内容:




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
<string> 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




为了了解语言级集成查询是如何工作的,下面来剖析第一段程序:



IEnumerable<string> expr = from s in names
where s.Length
== 5
orderby s
select s.ToUpper();


局部变量 expr 使用一个查询表达式(query expression)进行初始化。通过从标准查询操作符(standard query operators)或特定领域操作符(domain-specific operators)中申请一个或更多的查询操作符(query operators),查询表达式(query expression)可以访问一个或更多信息源(information sources)。这种查询表达式使用三种标准的查询操作符,即 WhereOrderBy,和 Select



Visual Basic 9.0 可以很好的支持 LINQ,在 Visual Basic 9.0 中实现上面语句(statement)的程序如下:



Dim expr As IEnumerable(Of String) = _
Select s.ToUpper() _
From s
in names _
Where s.Length
= 5 _
Order By s


以上 C# Visual Basic 的语句展示了查询的语法(query syntax),就像 foreach 语句一样,查询语法是一些可以让你轻松的手工编写的便利速记语句。上面的语句跟下面用 C# 编写的更直观的语法在语义上是一致的:



IEnumerable<string> expr = names
.Where(s
=> s.Length == 5)
.OrderBy(s
=> s)
.Select(s
=> s.ToUpper());


上面 WhereOrderBy Select 的操作符的参数被称作 lambda 表达式(lambda expressions),这些分段的代码很像委托(delegates,参见C++ 托管扩展中的委托)。它们允许标准查询操作符单独地定义成方法(method),并且可以用句点符号(dot notation)分隔的一列语句(strung together)的方式来使用。连接起来,这些方法就形成了一种可扩展(extensible)的查询语言的基本形式。




待续, 译者Naven 2005-10-20

1 comment:

Anonymous said...

This is great info to know.