【序】伟大的LINQ
为什么需要LINQ?
面向对象已经成为了软件开发的主流思想,而几乎每一个工程中都是围绕数据处理做文章的。
传统的ADO.NET已经大展身手,而且取代了老式的ADO,但是,不足之处也凸显出来。
1,处理任何一个简单的任务,都需要大量的步骤和冗长的代码。
2,执行命令,是操作数据的必要步骤。但是其命令是以字符串格式给出的,也就意味着,如果你使用了它,也就同时无法使用任何编译时检查。如果字符串中的命令非法,也无法得知。
3,好不容易写完了代码,发现代码中的类,仅仅能适用于SQL SERVER;但是,不同的数据库使用的SQL标准也不一样,SO,你写的代码十有八九无法移植。 当然,已经有了解决方案能搞定这些需求,比如某些对象关系映射工具,但是,他们有着致命缺陷,就是数据源单一。
这样的需求,只有微软能解决,而其他第三方厂商无法做到。因为,微软可以把数据访问和查询功能,集成到面向对象开发语言之中,比如:C#,VB.NET 。 这样,开发人员就可以使用自己熟悉的开发语言,去访问任何一种数据源类型。比如:内存,数据库,XML,XXX。而不是辛苦的去拼接SQL语句,或者是更多不同标准的SQL语句。这实在是太痛苦了。 简单的做几个小例子,展示一下LINQ的新特性: 1,操作内存数据
查询内存中的集合,根据条件筛选结果。
string[] words ={ \}; var shortwords = from word in words
where word.Length <= 5 select word; foreach (var word in shortwords) Console.WriteLine(word);
当然,代码和传统的操作相比,似乎没见到有什么大的改进,反而让人很奇怪。 有些朋友就疑问了,我用传统的string也可以做的很好,干嘛用LINQ? 突然,需求变更了。要求按照字母顺序对集合排序,然后按照长度分组,然后按照单词长度逆向排序,然后分组展示结果。
既然有了LINQ,那么就算这个需求再变态,我们也不用担心大量的代码了。 var groups = from word in words
orderby word ascending
group word by word.Length into lengthGroups orderby lengthGroups.Key descending
select new { Length = lengthGroups.Key, Words = lengthGroups };
foreach (var group in groups) {
Console.WriteLine(\ foreach (string word in group.Words) Console.WriteLine(\ }
OK,就是这么简单,看结果:
当然,LINQ远远不止这么简单的功能和应用场景。在我们用途最广泛的数据库访问,和XML操作上,一样能够大展身手,篇幅有限,我简单的介绍下在数据访问上的简单应用。
为了让新人容易操作和理解,我们拿SQL SERVER 2000里面自带的数据库Northwind做例子,也省去了建立数据库的时间。 我们用Employees表做实验,表结构如图所示:
OK,需求来了,我们筛选出City = London的Name。
注:【LINQ可以自动生成实体类和数据访问代码,但是,在这里为了演示,我自己手写这个实体类。】
[Table(Name = \ class Employees { [Column]
public string FirstName { get; set; } [Column]
public string City { get; set; } }
//这里为了简单,映射我只写出所需要的,而不是映射所有的列。
//连接字符串定义;当然,实际开发中,LINQ会自动生成。 string connectstring = \Catalog=Northwind;Integrated Security=True\
DataContext db = new DataContext(connectstring); //DataContext构造函数需要这个connectstring。 var Employees =
from Emp in db.GetTable
//筛选City等于London的对象
foreach (var Emp in Employees)
Console.WriteLine(Emp.FirstName); OK,结果出来了,如图:
我们需要的结果已经筛选完毕。
通过我们的小例子,可以看得出LINQ的优势: 1,自动打开数据库连接并且自己维护; 2,内置SQL查询生成功能; 3,自动执行SQL查询; 4,自动将结果填充到对象; 5,强类型数据访问;
6,开发人员使用自己熟悉的语言操作数据对象,如C#,VB.NET。 传统的ADO.NET,也确实有不足之处:
1,以字符串形式构造SLQ语句; 2,没有编译时检查; 3,松散绑定的参数; 4,弱类型结果集合; 5,代码冗长;
6,需要开发人员额外学习其他技能; --------------------------------
面向对象的思想和数据与对象之间的阻抗失调,以及对象关系映射,在LINQ提出的解决方案中,都得到了解决。
从传统数据访问API,到基于对象和元数据库的设计,微软站在了风口浪尖上,最终的产品,也确实让人满意。尤其是在没有使用新的CLR的情况下,把C#和VB.NET的语言特性扩展到这样的程度,让人惊叹,也许,这就是下一个传奇吧。
LINQ入门系列(一)一个小小小小的场景
上一次,我们通过《伟大的LINQ》了解了LINQ的一些新特性,今天,我们从C#的角度上来分析一下它的扩展。 需求1:
显示当前系统运行的进程列表。 解决方案1:基于.NET 2.0
使用System.Diagnostice.Process类里面的GetProcesses方法即可。 代码:
using System;
using System.Collections.Generic; using System.Text;
using System.Diagnostics;
class Program {
static void DisplayProcesses()