基於Expression Lambda表示式樹的通用複雜動態查詢構建器——《構思篇一》[已開源]

2023-05-25 12:01:16

再次回顧考察,看下面的查詢子句:

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;}
}

 

光文字看得似乎容易蒙逼,來張圖或者能輔助理解(圖示僅用來說明分組的層次):

  • 至此,把查詢條件用程式碼描述出來的構思就暫告一段落了。

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

  • 隨手點個讚唄!
  • 下集預告。。。。。如何得到目標表示式