LINQ学习笔记:表达式树
构建查询表达式 本节中, 我们假设我们拥有一个这样的实体类: 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |