走进Linq-Linq大观园
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
Coder一边展示着代码,一边念叨着,这里是因为使用了“扩展方法”所以可以这样写,这里使用了Lambda表达式,它可以简化匿名方法的写法,这里......
编程大师一边听着coder的讲解,一遍频频点头:“傻小子,不错啊,有点当年我的影子,按照你这样下去罗马也可以建成了,Linq也是可以写出来的呀。”
Coder听到大师的话兴奋异常,不过他从这句话里还是捕捉到了一个陌生的词汇:Linq。他用诧异的眼神看着大师,问道:”啥是Linq,是谁家又创造了个新词汇?”
大师笑着说,其实你刚才做的微软已经帮你做了,还给它起了一个非常洋气的名字:Linq,中文名字呢就叫做 语言集成查询。
在.net 3.5发布的时候,微软新发布了几个dll,其中有一个就叫做System.Core.dll,在这个dll下对一些System命名空间做了进一步扩展。
在System.Core.dll下的System命名空间下你会发现有这么几个泛型的委托:
public delegate TResult Func<TResult>();
//有一个参数和一个返回值,和你那个MyDelegate一样
public delegate TResult Func<T, TResult>(T arg);
//两个参数一个返回值
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
//三个参数一个返回值
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
//四个参数一个返回值
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
有了这几个泛型的委托基本上都能应付了吧。
还是在这个dll下有个System.Linq命名空间,这是Linq的核心命名空间,这里面有个名为Enumerable的静态类,它里面的方法都是对IEnumerable(这个接口可是Linq的中心人物啊)这个接口的扩展方法。看看,是不是在SQL里能用的这里都能找到了?
Select,Where,OrderBy, OrderByDescending,Average,Distinct
所以你现在很简单的就可以写出像下面这样的代码了:
.OrderBy(book=>book.Price)
.Select(book=>new{Key=book.Title,Value=book.Price});
编程大师接着说:如果就这样算了,我觉得Linq也不过尔尔,增加一些扩展方法而已,但是现在微软比我们想象的走的更远,现在你不仅仅能对程序中的一些集合对象做这样的查询了,你想想我们平时的程序可以归结为怎样一个等式?