声明:以下内容,是作者的一点想法其中一些内容与图片来源于一些英文文章,如有问题希望指正。

糊言乱语系列之:万物皆为源,Linq轻取之   1_数据源

面对对象编程通过二十多年的发展历程以慢慢演变成为企业级开发的主要开发方法,面对对象编程通过框架、系统API、快速开发工具等等以慢慢融入到程序员开发的每时每刻中。但是有一点儿一直困扰着使用面对对象编程的程序员,那就是关系型数据库与面对对象的关系,众所周知关系型数据库中的表对象是不能映射成对象的。这就使当把对象保存时,就必须有一个转换成关系型数据库表的一个过程。我们.net程序员可以通过ADO.NET提供的方法来实现保存对象到数据库中,但这个过程并不是无缝的并且也不是面对对象的(只不过我们通过一个间接的方法,让它看起来像是面向对象的)。

在传统的开发中我们一般情况下会使用以下程序来进行数据库操作,见下面的例子:


1:              int Stock = 0;
2:              int StockReturn = 0;
3:              int StockSell = SellCountNumber(commodityID);
4:
5:              DatabaseHelper dbHelper = new DatabaseHelper();
6:              object objstock =
7:     dbHelper.ExecuteScalar("select St from View_StockNumber where Commodity_ID="
8:                            + commodityID , CommandType.Text);
9:
10:              object objstockreturn =
11:     dbHelper.ExecuteScalar("select sum(St) from View_StockReturn where Commodity_ID="
12:                           + commodityID, CommandType.Text);
13:
14:              if (objstock is DBNull == false)
15:              {
16:                  Stock = Convert.ToInt32(objstock);
17:              }
18:              if (objstockreturn is DBNull == false)
19:              {
20:                  StockReturn = Convert.ToInt32(objstockreturn);
21:              }
22:
23:
24:              return Stock - StockReturn - StockSell;



我们再来看一个简单的例子,如果用真正的面向对象的数据库编程是什么样的:


1:      // 用Employees类来表示数据库中的Employee表
2:      Employees e = new Employees();
3:      // 设置一个唯一标示
4:      e.ID = 1;
5:      // 通过ID来查找到用户
6:      e.Retrieve();
7:      // 修改这一行的名字为Alan
8:      e.Name = “Alan”;
9:      // 将修改提交到数据库
10:      e.Upate();



以上的代码采用了面向对象的方法来处理数据库,没有查询没有烦人的SQL语句,这些东东大家通通都看不到。展现给大家的就是一个非常纯静并容易理解的代码。你只需要是思考如果处理对象之间的关系,并不需要思考其他的东西。这种实现的方法我们统称之为对象关系映射简称ORM。


什么是Linq?

早在2005年微软开发大会上(PDC)Anders和他的.net开发团队就公开宣称过Linq,你可以把它认为是一种从任何符合(IEnumerable接品)的数据源中读取数据的统一语言,呵呵,听起来有点绕口,想一想当年IBM出SQL的时候是不是也是很绕哪,对于Linq来说,数组、集合,关系型数据库,XML等等你都可以把它认为是数据源,都可以用Linq来读取。。呵呵。。有一句话正好适合它,《万物皆为源,Linq轻取之》。

为什么使用Linq?


对于LINQ,你可以简单的通过以下语法来从任何数据库中读取数据信息:


1:  var query = from e in employeesselect
2:  e.name


Linq的语法,非常的像SQL。Linq的开发团队的目标并不是开发出另一种读取数据库的方法,他们的目的是开发出一种原生的,可以嵌入到开发语言中的一种查询。使用C#语言就可以调用查询数据源中的数据,并且可以由c#编译器来保证类型与语法的正确性。呵呵,爽吧,我们完全可以忘了SQL了,其实在底层最终的实现还是SQL,只不过Linq提供了一种转化功能吧了,正是由于这是一种转化的过程,必然会出现性能上的损失,机器转换出来的SQL一定比人写的要差,这是一个不可否认的问题。这个矛盾就好像牛人说我想的汇编生的机器语言一定比你用C或者C++要强5倍,但是你想一想开发效率哪!你就不一定比我高了吧。。。

糊言乱语系列之:万物皆为源,Linq轻取之   1_.net_02

上图对Linq的一个基本功能展示,在最上层显示Linq是被开发语言从底层所支持的,当前C#3.0与VB9以上是完全支持LINQ的。

中间层显示着LINQ项目三个主要的部分:


LINQ to Objects:

Linq to Objects是一套API库,它提供了从符合IEnumerable<T>接口的所有数据源中操作一系列标准操作(SQO standard query operators)。这些查询都是在内存中完成的。

LINQ to ADO.NET

Linq to ADO.NET 是在SQO的基础上对关系型数据库的增强,它也主要包括了三个部分Linq to SQL、Linq to DataSet、Linq to Entities这三部分,这些我会在后面的博文中介绍。

LINQ to XML


呵呵。。写的有点累了,明天再继续吧。。希望 大家指正。