1.基于Expression Lambda表达式树的通用复杂动态查询构建器——《摘要篇》2.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》[已开源]
3.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源
4.基于Expression Lambda表达式树的通用复杂动态查询构建器——《原型篇一》[已开源]5.基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》接续[上篇之预告]
本篇来讲讲,如何根据前面设计的查询描述器构造出可执行的表达式。正如标题所示,实现手段将采用Expression Lambda技术。
先来看看主角System.Linq.Expressions.Expression 长什么样,都有些什么东西,能做什么。 先看看它的类图:

-
System.Linq.Expressions.MemberExpression 成员(属性或字段)
我们主要使用Expression这个类,它包含各种节点类型的 static工厂方法。特别是以下这些方法,对应了查询需要用到的逻辑、比较、数学,等各种运算操作。
以上仅列出了一部分,它涵盖了全部可能要使用到的函数,语句,欲详细了解可以直接乘坐火箭到微软官方网站查看。
这此函数或功能是有了,如何使用呢?来看个例子:将SQL:Table1.A > 5 and Table1.B=3,转成(Table1)=>Table1.A > 5 && Table1.B==3;
在Expression的世界里一切都是ExpressionTable1、A、5、B、 3先包装成Expression:
- 开干之前先谈个对象
//实体类: public class Table { public int A; public int B; }
- 然后包装各种
Expression
//将Table1包装成ParameterExpression: var p=Expression.Parameter(typeof(Table1),"Table1"); //将5、3这两个常量包装成ConstantExpression: var num5=Expression.Constant(5,typeof(int)); var num3=Expression.Constant(3,typeof(int)); //将两个属性包装成MemberExpression。 var a=Expression.PropertyOrField(p,"A") var b=Expression.PropertyOrField(p,"B") //构造Table1.A>5: var gt=Expression.GreaterThen(a,num5); //构造Table1.A=3: var eq=Expression.Equal(b,num3);
- 再构造两个比较式
//构造Table1.A>5: var gt=Expression.GreaterThen(a,num5); //构造Table1.A=3: var eq=Expression.Equal(b,num3);
- 加上逻辑
And将两个比较式连接起来
//构造Table1.A>5 && Table1.A=3 var exp=Expression.AndAlso(gt,eq);
- 结果就要出来了
//结果就获得了: var lambda=Expression.Lambda()
- 来来来,测试一下康康接果:
/*===============来来来,测试一下:===============*/ var f=lambda.Compile(); var x=f.DynamicInvoke(new Table(){A=6,B=3}); var y = f.DynamicInvoke(new Table() { A = 2, B = 3 }); Console.WriteLine("x:{0}\ny:{1}",x,y); Console.WriteLine("Lambda:{0}",lambda.ToString()); /*输出: 结果对吗?我也不知道,我撸得这么辛苦,先让电脑休息一下,各位看官只要Ctrl+C,Ctrl+V就可以看到了. */
- OK,其它各种操作,只要依葫芦画瓢便大功可成! 先爽一下!
- 好,暂且爽到这里,欲看如何把括号弄成俄罗斯套娃,且看下回分解.
- 随手点个赞,让我也爽爽,可好!