主頁 > 軟體設計 > 基于Expression Lambda運算式樹的通用復雜動態查詢構建器——《構思篇二》已開源

基于Expression Lambda運算式樹的通用復雜動態查詢構建器——《構思篇二》已開源

2023-05-27 07:47:57 軟體設計

接續[上篇之預告]

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

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

 

  • System.Linq.Expressions.ConstantExpression 常量

  • System.Linq.Expressions.DefaultExpression 默認值

  • System.Linq.Expressions.IndexExpression 索引

  • System.Linq.Expressions.MemberExpression 成員(屬性或欄位)

  • System.Linq.Expressions.MethodCallExpression 方法呼叫

  • System.Linq.Expressions.ParameterExpression 引數

  • System.Linq.Expressions.UnaryExpression 一元運算

  • System.Linq.Expressions.BinaryExpression 二元運算

  • System.Linq.Expressions.LambdaExpression 委托

 

我們主要使用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,其它各種操作,只要依葫蘆畫瓢便大功可成! 先爽一下!
  • 好,暫且爽到這里,欲看如何把括號弄成俄羅斯套娃,且看下回分解.
  • 隨手點個贊,讓我也爽爽,可好!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/553552.html

標籤:架構設計

上一篇:什么是一致性哈希?一致性哈希是如何作業的?如何設計一致性哈希?

下一篇:返回列表

標籤雲
其他(159803) Python(38173) JavaScript(25458) Java(18138) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7213) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5343) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1977) 功能(1967) Web開發(1951) HtmlCss(1948) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1862) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 基于Expression Lambda運算式樹的通用復雜動態查詢構建器——《

    還在手擼查詢代碼嗎?有沒有想過全自動的,通用的,免寫代碼的動態查詢?上一篇簡略講了如何把查詢條件用代碼描述出來,本篇接繼來講講,如何根據前面設計好查詢描述器構造出可執行的運算式。 ......

    uj5u.com 2023-05-27 07:47:57 more
  • 什么是一致性哈希?一致性哈希是如何作業的?如何設計一致性哈希?

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

    uj5u.com 2023-05-26 13:45:31 more
  • 什么是一致性哈希?一致性哈希是如何作業的?如何設計一致性哈希?

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

    uj5u.com 2023-05-26 13:30:11 more
  • 基于Expression Lambda運算式樹的通用復雜動態查詢構建器——《

    基于Expression Lambda運算式樹的通用復雜動態查詢構建器。在上一篇中構思了把查詢子句描述出來的資料結構,那么能否用代碼將其表達出來,如何表達呢?本篇來講講查詢描述器的構思。 ......

    uj5u.com 2023-05-25 09:21:31 more
  • 微服務架構基本原理學習筆記(一)

    一、什么是微服務 微服務是一種技術架構,通常我們可以把它理解為一組可以相互之間協同作業的應用程式或服務,這些應用程式或服務能夠被單獨部署到不同的服務器中,并且能夠自主運行和維護。 微服務技術只是一個名稱而已,或許我們在日常作業中已經或多或少在使用其中的一種或幾種技術和架構,但我們并沒有將其稱之為微服 ......

    uj5u.com 2023-05-25 09:21:12 more
  • 基于Expression Lambda運算式樹的通用復雜動態查詢構建器——《

    基于Expression Lambda運算式樹的通用復雜動態查詢構建器。在上一篇中構思了把查詢子句描述出來的資料結構,那么能否用代碼將其表達出來,如何表達呢?本篇來講講查詢描述器的構思。 ......

    uj5u.com 2023-05-25 09:20:40 more
  • 微服務架構基本原理學習筆記(一)

    一、什么是微服務 微服務是一種技術架構,通常我們可以把它理解為一組可以相互之間協同作業的應用程式或服務,這些應用程式或服務能夠被單獨部署到不同的服務器中,并且能夠自主運行和維護。 微服務技術只是一個名稱而已,或許我們在日常作業中已經或多或少在使用其中的一種或幾種技術和架構,但我們并沒有將其稱之為微服 ......

    uj5u.com 2023-05-25 09:20:19 more
  • 汽車之家10年系統架構演進與平臺化架構實踐

    汽車之家電商系統誕生在2014年,成長于2016~2019年,并經歷多年雙11、818晚會的洪峰考驗,沉淀了穩定可靠、性能卓越的在線交易能力。隨著業務中臺的建設浪潮興起,2019年進入中臺化建設階段,輸出其在汽車電商領域五年沉淀的能力,助力汽車電商行業發展,加速企業數字化轉型! ......

    uj5u.com 2023-05-25 09:19:51 more
  • Redis記憶體兜底策略——記憶體淘汰及回識訓制

    # Redis記憶體兜底策略——記憶體淘汰及回識訓制 Redis記憶體淘汰及回收策略都是Redis**記憶體優化兜底**的策略,那它們是如何進行**兜底**的呢?先來說明一下什么是記憶體淘汰和記憶體回收策略: - Redis記憶體淘汰:當Redis的記憶體使用**超過配置**的限制時,根據一定的策略洗掉一些鍵,以* ......

    uj5u.com 2023-05-23 12:43:04 more
  • Redis記憶體兜底策略——記憶體淘汰及回識訓制

    # Redis記憶體兜底策略——記憶體淘汰及回識訓制 Redis記憶體淘汰及回收策略都是Redis**記憶體優化兜底**的策略,那它們是如何進行**兜底**的呢?先來說明一下什么是記憶體淘汰和記憶體回收策略: - Redis記憶體淘汰:當Redis的記憶體使用**超過配置**的限制時,根據一定的策略洗掉一些鍵,以* ......

    uj5u.com 2023-05-23 12:26:29 more