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

来源:https://www.cnblogs.com/ls0001/archive/2023/05/27/ExpressionBuilder-3.html
-Advertisement-
Play Games

如果你有 *n* 個緩存伺服器,一個常見的負載均衡方式是使用以下的哈希方法: *伺服器索引 = 哈希(鍵) % N*,其中 *N* 是伺服器池的大小。 讓我們通過一個例子來說明這是如何工作的。如表5-1所示,我們有4台伺服器和8個字元串鍵及其哈希值。 ![image-2023052022160981 ...


接續[上篇之預告]

本篇來講講,如何根據前面設計的查詢描述器構造出可執行的表達式。正如標題所示,實現手段將採用Expression Lambda技術。

先來看看主角System.Linq.Expressions.Expression 長什麼樣,都有些什麼東西,能做什麼。 先看看它的類圖:

 

 

我們主要使用Expression這個類,它包含各種節點類型的 static工廠方法。特別是以下這些方法,對應了查詢需要用到的邏輯、比較、數學,等各種運算操作。

邏輯運算  
AndAlso(Expression, Expression) 表示And邏輯運算
OrElse(Expression, Expression) 表示Or邏輯運算
比較運算  
LessThan(Expression, Expression) 表示小於:"<"
LessThanOrEqual(Expression, Expression) 表示大於等於:“<="
GreaterThan(Expression, Expression) 表示大於:”>“
GreaterThanOrEqual(Expression, Expression) 表示大等於:”>="
Equal(Expression, Expression) 表示等於:”=“
NotEqual(Expression, Expression) 表示不等於:”!="
IsTrue(Expression) 測試表達式結果是否為“True"
IsFalse(Expression) 測試表達式結果是否為“False"
Not(Expression) 表示”Not"
數學運算  
Add(Expression, Expression) 加法
Subtract(Expression, Expression) 減法
Multiply(Expression, Expression) 乘法
Divide(Expression, Expression) 除法
Modulo(Expression, Expression) 模除
Power(Expression, Expression) 冪運算
一些操作  
Parameter(Type) 包裝一個類型為Type的參數
Call(Expression, MethodInfo, Expression, Expression) 包裝一個方法調用
Bind(MemberInfo, Expression) 包裝一個成員綁定,(屬性或欄位)
Quote(Expression) 包裝一個括弧
MakeUnary(ExpressionType, Expression, Type) 包裝一個一元運算
MakeBinary(ExpressionType, Expression, Expression) 包裝一個二元運算
TypeAs(Expression, Type) 包裝一個顯式引用或裝箱轉換,其中如果轉換失敗則提供“null”。
Coalesce(Expression, Expression, LambdaExpression) 包裝表示給定轉換函數的聚結操作。
變數、常量、欄位、屬性  
Default(Type) 包裝一個指定類型的預設值
Constant(Object, Type) 包裝一個常量
Assign(Expression, Expression) 賦值操作
Variable(Type, String) 包裝一個變數定義
Property(Expression, MethodInfo) 包裝一個屬性
Field(Expression, FieldInfo) 包裝一個欄位
PropertyOrField(Expression, String) 包裝一個指定名稱的欄位或屬性
要的就是這結果  
Lambda(Expression, ParameterExpression[]) 包裝一個委托,帶有一個參數表達式數組。

以上僅列出了一部分,它涵蓋了全部可能要使用到的函數,語句,欲詳細瞭解可以直接乘坐火箭到微軟官方網站查看。

這此函數或功能是有了,如何使用呢?來看個例子:將SQL:Table1.A > 5 and Table1.B=3,轉成(Table1)=>Table1.A > 5 && Table1.B==3;

Expression的世界里一切都是Expression。因此首先要將Table1A5B3先包裝成Expression

  • 開乾之前先談個對象
//實體類:
    public class Table
    {
        public int A;
        public int B;
    }

 

  • 然後包裝各種Expression
​
    //將Table1包裝成ParameterExpression:
    var p=Expression.Parameter(typeof(Table1),"Table1");
​
    //將5、3這兩個常量包裝成ConstantExpression:
    var num5=Expression.Constant(5,typeof(int));
    var num3=Expression.Constant(3,typeof(int));
​
    //將兩個屬性包裝成MemberExpression。
    var a=Expression.PropertyOrField(p,"A")
    var b=Expression.PropertyOrField(p,"B")
​
    //構造Table1.A>5:
    var gt=Expression.GreaterThen(a,num5); 
    //構造Table1.A=3:
    var eq=Expression.Equal(b,num3);    
    
​

 

  • 再構造兩個比較式
   //構造Table1.A>5:
   var gt=Expression.GreaterThen(a,num5); 
    //構造Table1.A=3:
    var eq=Expression.Equal(b,num3);    

 

  •  加上邏輯And將兩個比較式連接起來
    //構造Table1.A>5 && Table1.A=3
    var exp=Expression.AndAlso(gt,eq);

 

  •  結果就要出來了
//結果就獲得了:
    var lambda=Expression.Lambda()
        

 

  • 來來來,測試一下康康接果:
    /*===============來來來,測試一下:===============*/    
    var f=lambda.Compile();
    var x=f.DynamicInvoke(new Table(){A=6,B=3});
    var y = f.DynamicInvoke(new Table() { A = 2, B = 3 });
    Console.WriteLine("x:{0}\ny:{1}",x,y);
    Console.WriteLine("Lambda:{0}",lambda.ToString());          
    /*輸出:
    結果對嗎?我也不知道,我擼得這麼辛苦,先讓電腦休息一下,各位看官只要Ctrl+C,Ctrl+V就可以看到了.
    */

 

  • OK,其它各種操作,只要依葫蘆畫瓢便大功可成! 先爽一下!
  • 好,暫且爽到這裡,欲看如何把括弧弄成俄羅斯套娃,且看下回分解.
  • 隨手點個贊,讓我也爽爽,可好!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一說到創建桌面應用,就不得不提及Electron和Tauri框架。這次給大家主要分享的是基於electron最新版本整合vite4.x構建vue3桌面端應用程式。 之前也有使用vite2+vue3+electronc創建桌面端項目,不過 vue-cli-plugin-electron-builder ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、小票列印 目前市面上的小票印表機大多採用的列印指令集為ESC/POS指令,它可以使用ASCII碼、十進位、十六進位來控制列印,我們可以使用它來控制字體大小、列印排版、字體加粗、下劃線、走紙、切紙、控制錢箱等,下麵以初始化印表機為例: ...
  • apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函數運行時使用的 this 值。請註意,this 可能不是該方法看到的實際值:如果這個函數處於非嚴格模式下,則指定為 null 或 undefined 時會自動替換為指向全局對象,原始值會 ...
  • 具體的加密演算法可以可自行查詢其區別,這裡只是拋磚引玉,大部分加密方法基本都能通過改變傳入參數來實現。 C#相關類文檔: System.Security.Cryptography 命名空間 | Microsoft Learn Node JS相關文檔:Crypto | Node.js v16.20.0 ...
  • >我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ...
  • # JavaScript 格式化金額 ## 一、[使用 `Intl.NumberFormat` 構造函數](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberForm ...
  • > 隨著人工智慧技術的不斷發展,阿裡體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**雲上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那麼,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ...
  • 前端構建的提速是一項比較複雜且細節的工程, 目前產品上在持續跟蹤構建慢的應用, 努力優化編譯速度, 但前端本身擁有一個比較自由的技術環境, 沒有統一的構建工具與流程, 另外語言本身的執行效率、單線程的構建也不好讓編譯機發揮其最大能力, 所以目前全局的通用優化手段還是會比較局限, 還是依賴項目自身的優... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...