码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源


    合集 - 数据框架设计(5)
    1.基于Expression Lambda表达式树的通用复杂动态查询构建器——《摘要篇》05-122.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》[已开源]05-25
    3.基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源05-27
    4.基于Expression Lambda表达式树的通用复杂动态查询构建器——《原型篇一》[已开源]05-275.基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》05-29
    收起

    接续[上篇之预告]

    本篇来讲讲,如何根据前面设计的查询描述器构造出可执行的表达式。正如标题所示,实现手段将采用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。因此首先要将Table1、A、5、B、 3先包装成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,其它各种操作,只要依葫芦画瓢便大功可成! 先爽一下!
    • 好,暂且爽到这里,欲看如何把括号弄成俄罗斯套娃,且看下回分解.
    • 随手点个赞,让我也爽爽,可好!

  • 相关阅读:
    css 将div固定在页面顶部不随页面滑动
    SpringBoot项目知识点一:建包位置、启动类、banner
    使用python第三方库Parameterized进行接口参数化测试
    软件工程17-18期末试卷
    C语言分支和循环语句—for
    Vuex——笔试题、Vuex简介、引入方式、State、Getter、Mutation、Action、Module
    【泛人工智能】无人机仿真HITL实践
    为何90%以上的企业都在实施MES系统?到底有何好处?
    网络工具Netwox和Wireshark详解
    C++实现一个线程池
  • 原文地址:https://www.cnblogs.com/ls0001/p/ExpressionBuilder-3.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号