快速业务通道

LINQ学习笔记:表达式树

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13

构建查询表达式

本节中, 我们假设我们拥有一个这样的实体类:

   1: [Table] public partial class Product
   2:  
   3: {
   4:  
   5:   [Column(IsPrimaryKey=true)] public int ID;
   6:  
   7:   [Column]                    public string Description;
   8:  
   9:   [Column]                    public bool Discontinued;
  10:  
  11:   [Column]                    public DateTime LastSale;
  12:  
  13: }

 

委托 VS 表达式树

让我们回忆一下:

1. 本地查询,使用的Enumerable操作符,使用委托

2. 解释查询(Interpreted Query),使用Queryable操作符,使用表达式树

我们可以比较一下Where操作符在Enumerable和Queryable当中的签名:

   1: public static IEnumerable Where (this
   2:  
   3:   IEnumerable source,
   4:  
   5:   Funcbool> predicate)
   6:  
   7: public static IQueryable Where (this
   8:  
   9:   IQueryable source,
  10:  
  11:   Expressionbool>> predicate)

 

当把他们嵌入到一个查询当中的时候,Lamdba表达式看上去都是一样的,无论它是绑定到Enumerable或者Queryable:

   1: IEnumerable q1 = localProducts.Where
   2:  
   3:                                (p => !p.Discontinued);
   4:  
   5: IQueryable q2 = sqlProducts.Where
   6:  
   7:                               (p => !p.Discontinued);

 

当你将一个Lambda表达式赋给一个中间变量的时候, 你必须显示地指示是将它绑定到委托(Func<>)或者是表达式树(Expression<>>)

编译表达式树

通过调用Compile我们可以将一个表达式树转换为委托. 当我们编写的方法返回可重用的表达式时这回带来特别的价值. 为了演示,我们将给Product类增加一个静态方法, 其返回一个bool值用于断言那些Discontinued并且在过去30天内销售的产品.

   1: public partial class Product
   2:  
   3: {
   4:  
   5:   public static Expressionbool>>
   6:  
   7:   IsSelling()
   8:  
   9:   {
  10:  
  11:     return p => !p.Discontinued &&
  12:  
  13:                 p.LastSale > DateTime.Now.AddDays (-30);
  14:  
  15:   }
  16:  
  17: }

 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号