很久前就开始关注Linq( Language Integrated Query)技术了, 文章读了不少,都是纸上谈兵,从来没有用过一下,我现在一直都用vs.net2005做项目,在2005中有一个CTP版本的Linq,这个只能装在英文版上,我的是中文版的,想装也装不上。现在vs.net2008已经出beat2了,beat2推出说明年末或明年初正式版可能就会出来,正好这段时间比较空闲,就下载一个装上了。
Vs.net2008中提供了很多令开发人员激动不已的新功能,这其中最突出的亮点之一就是所谓的集成语言查询Linq。Linq在此前的一些版本中不同功能是由不同团队开发的,所以有很多称呼,比如Linq to Object,Linq to XML,Linq to SQL等,我们统称为Linq好了,它们分别提供对象的集成查询,xml集成查询,数据库与对象OR/M及其集成查询,以前在项目中OR/M大都采用从Java移植过来的NHibernate,虽然这也是一个非常优秀并广泛使用的OR/M框架,但使用和配置都没有Linq to SQL简便,语言集成化程度就更没有可比性了。在Linq中为所有对象(一般对象,实体数据对象,XML数据对象等)提供了统一的集成查询技术,在对象查询中所积累的经验和技巧,完全可用于数据库的查询,这就意味着对于一般C#程序员来说,甚至不需要专门学习数据库或XML方面的知识,这个功能就太牛比了。
Linq何以有此超强的能力?关键在于.NET3.0以后所提供的“扩展方法”,为其打开了任督二脉。扩展方法(Extension Methods),就是往一个类里面增加新方法,不需要编写子类,也不会破坏类的封装,也不需要重编译这个类。按理说这似乎没什么特别之处,不会这么神奇吧,下面看一个简便的例子。
为了判断一个对象是否存在于一个集合中,编写了如下扩展方法如下:
namespace MyExtensionMethods{
public static class MyMethods{
public static bool IsIn(this object o,IEnumerable arr){
foreach(object e in arr){
if(e.Equals(o)){
return true;
}
}
return false;
}
}
}
注意上面声明这个扩展方法时用的是this object o,这表示这个方法可以加入到System.Object这个类,这个加入的工作是由编译器去完成的,要使用这个扩展方法只需要引入所在的名称空间就行了。就好象甲A外援,打完球走人,不用担心从根本上改写了System.Object.
现在开始使用:
using MyExtensionMethods; //引入包含此扩展方法的名称空间
public class Test{
public static void Test1(){ //用于字符串数组
string[] names={“张三”,”李四”,”王五”};
string checkName=”李四”;
bool ok=checkName.IsIn(names)
}
public static void Test2(){ //用于整数数组
int[] ints={1,2,3,5,7,9,0,18};
int checkInt=100;
bool ok=checkInt.IsIn(ints);
}
public static void Test3(){ //用于对象数组
DataTable table1=new DataTable();
DataTable table2=new DataTable();
DataTable table3=new DataTable();
DataTable[] tables={table1,table2,table3};
bool ok=table2.IsIn(tables);
}
……
}
因为Object类在.net中是所有类型的基类,所以就可以在所有类上使用这个扩展方法了。上面虽然是一个非常简单的实例,但说明了扩展方法可以在申明类型的所有对象中,以同一种方式使用,这就是扩展方法的威力。Linq能够在几乎所有对象之间纵横驰骋,正是这个貌似简单原理的深入应用。
有这样一个语句xxx.students.where(p=>p.Name.StartsWith(‘王’)),在Linq中可用于查找姓“王“的所有学生。设想一下,如果把学生数据放在内存中,或者数据库中,或者XML中,不管是哪种形式存放,都可以用上面的语句进行查询,这是多么让人兴奋的事情啊。
非常不幸,Linq正是这样的,Linq在扩展方法的外壳下,包装融合了多项最新技术,为我们带来了崭新的开发技术和新思维。
在我们使用Linq的强大功能构建应用程序项目的时候,请不要忘记了那个幕后英雄, “超级的”扩展方法。