基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》[已开源]
1.基于Expression Lambda表达式树的通用复杂动态查询构建器——《摘要篇》
2.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》[已开源]
3.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源4.基于Expression Lambda表达式树的通用复杂动态查询构建器——《原型篇一》[已开源]5.基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢?
Id>1 and Id<10
如上所示,有两个独立的条件分别为Id>1
和 Id<10
,用一个逻辑操作符 and
连接起来。
再看下面这条,后面也是两个独立条件通过操作符or
连接,并包在括号里,作为一个整体。
Id>1 and Id<10 and (Name="MyName" or Name="HisName")
可以看到当中包含几种元素:字段名称,逻辑操作符,比较操作符,条件值,数据类型,括号。两个概念:独立的条件和由括号包将它们起来的整体。
那么可以设计两个类来代表独立条件和条件组,如下所示:
//独立条件伪代码:
public class Field
{
public enum Logical {get;set;} //与其它条件之间的逻辑关系
public enum comparer {get;set;} //条件比较符
public Type DataType {get;set;} //数据类型
public string FieldName {get;set;} //字段名称
public object QueryValue {get;set;} //条件值
}
由于复杂的查询的括号是可嵌套的,多重组合的,类似下面的还算简单的子句:
(dept="mgr" or dept ="bi" ) and(Id>1 and Id<10 and (Name="MyName" or Name="HisName"))
那么条件组里就需要包含独立条件和条件组,并且可嵌套,即组中有组:
//条件组伪代码:
public class Block
{
public enum Logical {get;set;} //与其它条件组或独立条件之间的逻辑关系
public List<Field> Fields {get;}
public List<Block> Blocks {get;}
}
光文字看得似乎容易蒙逼,来张图或者能辅助理解(图示仅用来说明分组的层次):
-
至此,把查询条件用代码描述出来的构思就暂告一段落了。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律