封装自己的dapper lambda扩展-设计篇(二)

简介: 封装自己的dapper lambda扩展-设计篇(二)

表达式树的解析


具体实现的时候会涉及到很多的表达式树的解析,例如where条件、部分字段update,而我实现的时候一共两步:先修树,再翻译。然而无论哪步都得对表达式树进行遍历。


表达式树


百度的定义:也称为“表达式目录树”,以数据形式表示语言级代码,它是一种抽象语法树或者说是一种数据结构。


我对它的理解是,它本质是一个二叉树,节点拥有自己的属性像nodetype。


而它的遍历方式为前序遍历


前序遍历


百度的定义:历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,以下图为例


image.png


其遍历结果为:ABDECF


以一个实际例子:


image.png


从上图可以看出,我们会先遍历到根节点的NodeType AndAlso翻译为 and ,然后到节点2,NodeType的Equal翻译为 = ,再到3节点翻译为 Name,再到4节点翻译为'skychen',那么将3、4节点拼接起来就为Name = 'skychen',


如果类推6、7为Age >= 18,最后拼接这个语句为 Name = 'skychen' and Age >= 18。


修树


修树的目的,为了我们更好的翻译,例如DateTime.Now表达式树里的NodeType为MemberAccess,我希望转换成NodeType为Constant类型,以'2018-06-27 16:18:00'这个值作为翻译。


结束


以上为设计和实现的要点,具体的实现问题可以查看源码,如果有建议和疑问可以在下方留言,如果对您起到作用,希望您点一下推荐作为对我的支持。


再次双手奉上源码:


https://github.com/SkyChenSky/Sikiro.DapperLambdaExtension.MsSql


目录
相关文章
|
7月前
|
安全 Java 数据安全/隐私保护
|
设计模式 Cloud Native JavaScript
掌握Go类型内嵌:设计模式与架构的新视角1
掌握Go类型内嵌:设计模式与架构的新视角
75 0
|
设计模式 编译器 Go
掌握Go类型内嵌:设计模式与架构的新视角2
掌握Go类型内嵌:设计模式与架构的新视角
72 0
|
SQL 关系型数据库 Go
Go语言微服务框架 - 12.ORM层的自动抽象与自定义方法的扩展
随着接口参数校验功能的完善,我们能快速定位到接口层面的参数问题;而应用服务的分层代码,也可以通过log的trace-id发现常见的业务逻辑问题。 但在最底层与数据库的操作,也就是对GORM的使用,经常会因为我们不了解ORM的一些细节,导致对数据的CRUD失败,或者没有达到预期效果。这时,我们希望能在ORM这一层也有一个通用的解决方案,来加速问题的排查。
90 0
|
程序员 数据安全/隐私保护 C++
C++面向对象封装特性的实例分析与应用扩展(一)
生活中充满复杂性,处理复杂性的方法之一就是简化和抽象。在计算中,为了根据信息与用户之间的接口来表示它,抽象是至关重要的。将问题的本质特征抽象出来,并根据特征来描述解决方案。抽象往往是用户定义类型的捷径,在C++中用户定义类型指的就是实现抽象接口的类设计。
136 1
C++面向对象封装特性的实例分析与应用扩展(一)
|
编译器 C语言 索引
SystemVerilog学习-03-设计特性与接口
SystemVerilog学习-03-设计特性与接口
332 0
SystemVerilog学习-03-设计特性与接口
|
安全 Java
java面向对象三大特性,封装篇
1.封装的概念 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
109 0
|
编译器 C语言 C++
C++面向对象封装特性的实例分析与应用扩展(二)
封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class 类名{ 访问权限: 属性 / 行为 }; 示例1:设计一个圆类,求圆的周长
153 0
C++面向对象封装特性的实例分析与应用扩展(二)
|
uml
封装自己的dapper lambda扩展-设计篇(一)
封装自己的dapper lambda扩展-设计篇(一)
236 0
封装自己的dapper lambda扩展-设计篇(一)
|
SQL 关系型数据库 MySQL
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0
232 0
开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0