Language INtegrated Query,很强大!

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比想象得复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值