基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》[已开源]

再次回顾考察,看下面的查询子句:

Id>1 and Id<10

如上所示,有两个独立的条件分别为Id>1Id<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;}
}

 

光文字看得似乎容易蒙逼,来张图或者能辅助理解(图示仅用来说明分组的层次):

  • 至此,把查询条件用代码描述出来的构思就暂告一段落了。

  • 欲了解更多,挖掘更多,敬待下期分解。

  • 随手点个赞呗!
  • 下集预告。。。。。如何得到目标表达式

 

posted @ 2023-05-25 08:57  Tongze  阅读(606)  评论(4编辑  收藏  举报