日期:2014-05-20  浏览次数:20926 次

LINQ(Language Integrated Query)(1):简介

C# 2.0最大的改进是泛型.C# 3.0最大的改进就是Linq(语言集成查询).Linq又细分三大块:Linq to XML,Linq to ADO.NET(Linq to SQL,Linq to DataSet,Linq to Entity),Linq to Object.

关于Linq的争议

有些人对Linq to ADO.NET可能有很多异议.觉得它是对ADO.NET再封装一次,性能降低了 .而且ADO.NET用着也挺好的.干嘛那么麻烦再学个新技术Linq.其实编程语言中新增加的一些特性往往是为了更方便开发人员,提高开发效率,降低你犯错误的可能性.当然同时得也得考虑性能方面的事了.但是现在电脑硬件配置越来越好.以前的内存才那么几百M,现在动不动就几G,CPU性能也越来越好.所以有时别太为电脑去考虑.多为程序员考虑下.怎么少写点代码实现更多的功能.至于那些简单的代码后面再要执行啥复杂的操作也不用考虑太多.像托管代码不就是替你做了很多事,比如不用去考虑啥内存泄露这样的烦心事了嘛.中间多了个CLR性能自然下降了.但你写起代码来多省事了啊.

当然了如果你觉得Linq性能不好也可以完全不用,它实现的功能采取其他方法也照样能实现.只不过多写些代码罢了.

简单例子

先举几个关于Linq to Object简单例子来大概介绍下Linq的语法.看具体怎么用.

string[] names = { "arwen", "james", "sunny", "lily", "ada" };

 var name   = from na in names

                      select na;

            foreach (var str in name)

            {

                string s = str;

                Console.WriteLine(s);

            }

分析:

首先说下关键字var,它是用来做类型推断,也就是说它可以用来代替string,int等所有关键字来定义一个类型.然后编译器可编译时可以通过变量的值推断出变量类型.

其实在这里你也可以用IEnumerable<string> name 来代替var name这样定义变量.

然后就是from,select这样的关键字了.看起来很像SQL语句的语法吧.Linq的设计应该就是参照了SQL的思想吧.sql语句就是封装了很多细节,只告诉计算机去做什么,而不用告诉他具体怎么做.而我们平时用C#,Jave,C++这些语言都不仅要告诉计算机去做什么,还要怎么做.把具体的每一步用代码写出来.以上面的例子来说.如果我们要获取数组中以a开头的元素.如果没用Linq你必须这样写代码去判断

List<string>  list = new List<string>();

foreach(string s in names)

{

     if(s.StartWith("a")

    list.Add(s);

}

就是说要自己指定计算机去具体怎么做.但如果用Linq的话就直接用下面的语句

var name =   from na in names

                       where na.StartsWith("a")

                       select na;

用一个where去告诉计算机做什么就行.具体怎么做就不用管了.

所以Linq的真正的意义不仅是使你的一些操作更简单,而且引进了SQL语句那种思想.尽量封装一些具体操作细节,把注意力放在软件要实现的功能方面.当然SQL语句应用范围也是有限,只能针对表的一些简单操作,更复杂的操作还需要一些扩充,比如SQL Server有T-SQL,Oracle有PL/SQL,面对一些复杂的操作它们还得写很多代码去告诉计算机具体怎么做.

Linq也同样有局限的.查询语言,顾名思议只能查询数据.所以我们只能从数组names中获取数据,而不能通过Linq去修饰里面的数据.

Linq很多用法跟SQL类似,所以可以参照SQL那些关键字用法学下.当然Linq还有其他一些更复杂的操作.再举个简单例子说下把获得的数据排序

string[] names = { "arwen", "james", "sunny", "lily", "ada" };

var name = from na in names

orderby na descending      

select na;