Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算。通常表达式目录树是配合Lambda一起来使用的,lambda可以是匿名方法,当然也可以使用Expression来动态的创建!
func:是方法
表达式:是数据结构,可以被解析

使用时表达式目录树可以转换成Func委托

如下示例,第一行代码与下面的代码模块功能一致,首先申请两个变量m,n;
multiply函数为两个值相乘,而add则是相加


当我们有两个相同内容得class类型式,我们想要模型转换,我们可以使用硬编码、(前面写的)反射,或者第三方得序列化jsonConvert。但是如果考虑性能问题,我们就可以使用表达式目录动态生成硬编码。如下:

首先我们定义一个静态缓存(再次执行时读缓存)





比如我们写一个一百万次得调用,我们有硬编码调用、泛型、反射等等



我们看一下结果:

由此可以看出硬编码效率最高,但也最不灵活,而使用缓存则效率相对较搞,而cache普通缓存为何会比泛型缓存慢呢,因为字典浪费在查找上了,它是一个hash分布得,首先找到Key,进行hash计算,才能在内存上锁定位置。
1.可以用来替代反射,虽然反射可以通用,但性能不够
2.生成硬编码,可以提升性能
1.递归解析表达式目录树。
2.只有一个入口叫Visit
3.首先检查是什么类型得表达式,然后调用对应得 Protected virtual visitor方法
4.得到结果继续去检查类型,调用对应得visitor方法.........




当我们想将一个表达式转换为sql时,例如p.Age>5,把左边得转换为右边得\ where Age>5形式

解析表达式,组装sql,挨个把字符串放入栈内。

碰到常量5时,在进入Constant方法,然后放入栈中。

当NodeType判断为GreatThen时,替换为‘>’大括号,放入栈中

当解析到左边x.Age>5时是一个属性类型,则进入VisitMembet方法,我们可以获取到Member.Name也就是Age,同样放入到栈中

此时我们完成了转换,可以看到我们得栈列表中的数据,然后把栈内的数据拿出来拼接成字符串。







