本书翻译目的为个人学习和知识共享,其版权属原作者所有,如有侵权,请告知本人,本人将立即对发帖采取处理。
允许转载,但转载时请注明本版权声明信息,禁止用于商业用途!

博客园:韩现龙

第一章LINQ简介

概述

通过上网,你可以找到一些关于语言集成查询(LINQ)的说明,比如下面这些:

· LINQ 是针对任意一种数据的统一编程模型。LINQ使你可以通过某个独立于数据源的模型来查询和操纵数据。

· LINQ只是将SQL查询嵌入到代码中的另一种工具。

· LINQ 是另一种数据抽象层。

所有的这些描述在一定程度上是正确的,但是它们只是提到了某个单一的方面。LINQ可以做许多的事情,而不仅仅是嵌入式的SQL查询,它比“统一编程模型”要简单易用而且远远不只是数据建模的另一组规则。

LINQ是一种简化并且将任意一种数据访问接口实现的技术。LINQ没有强制你去使用某种特定的架构,它促进实现了现存的架构对数据的访问。像每一个工具一样,它可能被用得好,也可能被用得不好。为了使充分利用LINQ,你必须精通掌握它。

今天,程序控制的数据可以属于不同的数据域:一个数组(array),一个对象图表(object graph),一个XML文件(XML document),一个数据库(database),一个文本文件(text file),一个注册表值(a registry key),一封电子邮件(e-mail message),简单对象访问协议(Simple Object Access Protocol)信息内容,一个微软的Excel表格……举不胜举。

每一种数据域有它自己的访问方法。当查询一个数据库时,你很自然地就用SQL,当你访问XML数据时,很自然地就用DOM或者XQuery。为了定位某个对象图你遍历一个数组并且构建自己的算法。你使用特定的应用程序(APIs)来访问其他的数据域,比如说Office 的Excel表格,一封电子邮件,或者其他的MS的Windows注册表。最终的结果是,在访问不同的数据源时就有了不同的编程模型。

已经有多种方式尝试着将多种数据访问技术融入到一个综合的模型中。例如,在ODBC的Provider让你像WMI存储数据一样查询Excel文件。然而,在这种方法下你用像SQL一样的语句来访问通过关系模型(relational model)表现的数据。有时数据在层次或者图形模型下显然会比关系型的数据要更高效。而且,如果数据模型和语言无关的话,你可能还必须管理不同类型的系统。所有这些都导致了在数据和代码之间的“阻抗失谐(impedance mismatch)”。LINQ试图去解决这些问题,它提供了一个统一的访问和操作数据的方式,而无须强制采用一个“一体适用(one size fits all)”的模型。LINQ在这些数据模型之间的操作(operations)上起到一个平衡的作用,而不是将除去的各种不同的架构(structures)之间的差异。

在本章中,我们将会对LINQ进行一个综合的简介,在本书的其余部分中,你能够加深对这个新而强大技术的理解。

 

什么是LINQ?

LINQ是一个将查询作为首要类的概念引入到Microsoft .NET中的任何一种语言中编程模型。然而,在使用的语言中对于LINQ的完全支持需要一些扩展,这些扩展极大提高了生产力,由此也提供一个更短的,有意义并且富于表现的语法来操纵数据

 

下面是一个简单的一个典型的软件解决方案中的LINQ查询,它返回国家在Italy的所有客户的名字集合:

var query =
    from   c in Customers
    where  c.Country == "Italy"
    select c.CompanyName;

 

现在请不要担心语法和关键字(像var关键字)。这个查询的结果是一个strings集合。在C#中你可以用一个foreach语句去对该结果进行枚举处理:

foreach ( string name in query ) {
    Console.WriteLine( name );
}

 

刚才这两个查询定义和foreach循环在C#3.0声明中很平常。在这里,你可能会奇怪我们查询的是什么。Customers是什么?这是一种新型的嵌入式的SQL查询吗?不是的。同样的查询(下面的foreach代码也是)对一个SQL数据库,对一个DataSet,对一个在内存中的数组,或者对其他的多种数据同样适用。Customers是一个对象的集合:

Customer[] Customers;

 

Customers也可以是在DataSet中的一个DataTable:

DataSet ds = GetDataSet();
DataTable Customers = ds.Tables["Customers"];

 

Customers也可以是描述关系型数据库中的某个物理表的一个实体类:

DataContext db = new DataContext( ConnectionString );
Table<Customer> Customers = db.GetTable<Customer>();

 

最后,Customers也可以是一个描述概念模型和映射一个关系型数据库的实体类:

NorthwindModel dataModel = new NorthwindModel();
ObjectQuery<Customer> Customers = dataModel.Customers;

 

正如您所见,在LINQ中使用的像SQL一样的语法叫做查询表达式(query expression)。实现嵌入式SQL的语言仅定义了简单的语法来将SQL声明嵌入到不同的语言中,但是这些声明没有集成到这些语言本身的语法和类型系统中。例如,你不能在SQL声明中间调用一个用主语言写出的函数,虽然在LINQ中是可能的。LINQ不仅仅是查询数据库,也不仅仅是嵌入式SQL语句。

译注:

本篇专有词库:

[1]数据抽象层:  data abstraction layer

[2]统一编程模型:uniform programming model

[3]对象图表:       object graph

[4]简单对象访问协议:Simple Object Access Protocol

[5]关系模型:       relational model

[6]阻抗失谐:       impedance mistach

[7]一体适用:       one size fits all

[8]查询表达式:   query expression


 

上一篇:Introducing Microsoft LINQ--版权声明及本书简介

下一篇:LINQ工作原理,关系模型,XML操作

posted on 2008-01-23 17:31  是谁啊?  阅读(4141)  评论(20编辑  收藏  举报