LINQ,提供了对所有支持IEnumerable的对象(包括数据)进行查询的能力,很强很暴力哟~。这篇文章的内容,打个比方,有些类似于office excel中的表达式,只是类似。
lambda不仅能在委托中应用,而且可以用在表达式树中(基于System.Linq.Expressions名字空间的类型)。
下面的泛型委托使用了lambda,Func<int, int> func1 = n => n+1;--表示输入的类型是整型输出的类型是整型。
通过表达式树(expression trees),可以把委托用作为类型:Expression<Func<int, int>> expr = n => n+1;表示Expression<Func<int, int>> 的实例是expr,这时系统会对lambda表达式自动作出处理。
以上意味着,表达式树具备动态委托的能力。(而C#正是经过这样地抽象封装,逐级逐步地实现着open-ended语言能力,并使原各部位更加强壮。)其实现如下。
using System;
using System.Linq;
using System.Linq.Expressions;
public class EntryPoint
{
static void Main() {
Expression<Func<int, int>> expr = n => n+1;
Func<int, int> func = expr.Compile();//编译委托
for( int i = 0; i < 10; ++i ) {
Console.WriteLine( func(i) );
}
}
}
当把lambda表达式赋给Expression<T>的实例时,系统实际上充当表达式解析器(parser)的作用。
不使用lambda表达式也可以达到相同的目的,示例如下。
using System;
using System.Linq;
using System.Linq.Expressions;
public class EntryPoint
{
static void Main() {
var n = Expression.Parameter( typeof(int), "n" );//表示参数--整型变量n
var expr = Expression<Func<int,int>>.Lambda<Func<int,int>>(
Expression.Add(n, Expression.Constant(1)),n );//使用Expression泛型式的Lambda泛型方法增加n的第一个常量值
Func<int, int> func = expr.Compile();
for( int i = 0; i < 10; ++i ) {
Console.WriteLine( func(i) );
}
}
}
我们再来看一个对lambda表达式进行“替换-更新”的例子:
using System;
using System.Linq;
using System.Linq.Expressions;
public class EntryPoint
{
static void Main() {
Expression<Func<int,int>> expr = n => n+1;
// 这里把原lambda表达式替换为2倍作为第2个常量
expr = Expression<Func<int,int>>.Lambda<Func<int,int>>(
Expression.Multiply( expr.Body,Expression.Constant(2) ),
expr.Parameters );
Func<int, int> func = expr.Compile();
for( int i = 0; i < 10; ++i ) {
Console.WriteLine( func(i) );
}
}
}
小结:表达式树能够对所有符合IEnumerable的类型进行描述,包括其它结构的存储形式,如XML、关系数据库。这也是C#能够实现LINQ-collection(Linq to sql、Linq to dataset、Linq to entities、Linq to xml、Linq to objects)的根本原因。
总结:表达式树是一种语言原生的,用来描述数据操作的非OO机制,提供了算法分离原型,是C#函数编程的基础。这在OO大行其道的情况下,这种相对非依附能力有其非常独到之处;这种本质上类似脚本的东东,使得我们在OO之上,开拓新的思路,与此相似的是Lisp语言。
另,在.NET体系中,我们可以清楚地看到,linq2sql被定位于表域(table domain space)!实际上,linq比想象得复杂。
分享到:
相关推荐
LINQ,语言级集成查询(Language INtegrated Query) 经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经...
LINQ是Language Integrated Query的简称,它已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处
Pro LINQ - Language Integrated Query in C# 2010 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如...
Pro LINQ: Language Integrated Query in C# 2010 is all about code. Literally, this book starts with code and ends with code. Most books show the simplest examples of how to use a method, but they so ...
VB版本的LINQ.
APress - Pro LINQ - Language Integrated Query In C# 2008.pdf
Pro LINQ Language Integrated Query 非常给力的LINQ资料(很全面)
Pro LINQ Language Integrated Query in C# 2010
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。...
pro linq language integrated query in c# 2010 英文pdf+源码
.NET Language-Integrated Query
Pro LINQ Language Integrated Query in C# 2008书本PDF和源码
Pro LINQ: Language Integrated Query in C# 2010 is all about code. Literally, this book starts with code and ends with code. Most books show the simplest examples of how to use a method, but they so ...
《Language-Integrated Query (LINQ).pdf》 《Language-Integrated Query (LINQ) 译文.pdf》 《LINQ to SQL 语法.pdf》中文 《Language-Integrated Query (LINQ).pdf》 《Pro LINQ - Language Integrated Query in ...
LinQ学习指南 Linq目标是实现语言与数据的深度结合,Linq以统一的数据访问方式访问各种数据源,以相同的方式读取数据,象SQL语句一样进行查询,而这些都是整合在我们熟悉的编程语言如C#,VB当中,另外Linq是使用强...
pro-linq-language-integrated-query-in-c#
A port of LINQ (Language-Integrated Query) to Java
Apress出版的,介绍新版C# 2008中的LINQ
非常好的学习linq的c#的PDF资料。