码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • (十一)笔记.net学习表达式目录树Expression


    (十一).net表达式目录树Expression

    • 1.什么是表达式目录树
        • (1)Func和表达式的不同
        • (2)表达式树拆解
        • (3)自己拼装表达式目录
    • 2.动态拼装表达式目录和扩展应用
        • (1)表达式树之模型转换缓存
        • (2)使用泛型缓存
        • (3)性能测试
    • 3.表达式目录树动态生成得用途
    • 4.解析表达式目录,生成sql
        • 1.ExpressionVisitor
        • 2.解析表达式目录树
        • 3. 解析为sql
    • 5.表达式树的拼装链接

    1.什么是表达式目录树

    Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算。通常表达式目录树是配合Lambda一起来使用的,lambda可以是匿名方法,当然也可以使用Expression来动态的创建!

    (1)Func和表达式的不同

    func:是方法
    表达式:是数据结构,可以被解析
    在这里插入图片描述
    使用时表达式目录树可以转换成Func委托
    在这里插入图片描述

    (2)表达式树拆解

    如下示例,第一行代码与下面的代码模块功能一致,首先申请两个变量m,n;
    multiply函数为两个值相乘,而add则是相加
    在这里插入图片描述

    (3)自己拼装表达式目录

    在这里插入图片描述

    2.动态拼装表达式目录和扩展应用

    (1)表达式树之模型转换缓存

    当我们有两个相同内容得class类型式,我们想要模型转换,我们可以使用硬编码、(前面写的)反射,或者第三方得序列化jsonConvert。但是如果考虑性能问题,我们就可以使用表达式目录动态生成硬编码。如下:
    在这里插入图片描述
    首先我们定义一个静态缓存(再次执行时读缓存)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    (2)使用泛型缓存

    在这里插入图片描述
    在这里插入图片描述

    (3)性能测试

    比如我们写一个一百万次得调用,我们有硬编码调用、泛型、反射等等
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们看一下结果:
    在这里插入图片描述
    由此可以看出硬编码效率最高,但也最不灵活,而使用缓存则效率相对较搞,而cache普通缓存为何会比泛型缓存慢呢,因为字典浪费在查找上了,它是一个hash分布得,首先找到Key,进行hash计算,才能在内存上锁定位置。

    3.表达式目录树动态生成得用途

    1.可以用来替代反射,虽然反射可以通用,但性能不够
    2.生成硬编码,可以提升性能

    4.解析表达式目录,生成sql

    1.ExpressionVisitor

    1.递归解析表达式目录树。
    2.只有一个入口叫Visit
    3.首先检查是什么类型得表达式,然后调用对应得	Protected virtual visitor方法
    4.得到结果继续去检查类型,调用对应得visitor方法.........
    
    • 1
    • 2
    • 3
    • 4

    2.解析表达式目录树

    1. 创建一个类去集成ExpressionVisitor,调用基类方法Visit,传入表达式(m*n+2)
      在这里插入图片描述
    2. 解析,重写VisitBinary方法,传入表达式,此时我们可以判断表达式类型做相应得解析处理,比如我们的表达式为(mn+2),那么当判断为add时,就会执行Subtract方法使左边减去右边,变成(mn-2),我们就完成了表达式修改。
      在这里插入图片描述
      调用方法和参数形式也是可以得
      在这里插入图片描述
      在这里插入图片描述

    3. 解析为sql

    当我们想将一个表达式转换为sql时,例如p.Age>5,把左边得转换为右边得\ where Age>5形式
    在这里插入图片描述

    解析表达式,组装sql,挨个把字符串放入栈内。
    在这里插入图片描述
    碰到常量5时,在进入Constant方法,然后放入栈中。
    在这里插入图片描述
    当NodeType判断为GreatThen时,替换为‘>’大括号,放入栈中
    在这里插入图片描述
    当解析到左边x.Age>5时是一个属性类型,则进入VisitMembet方法,我们可以获取到Member.Name也就是Age,同样放入到栈中
    在这里插入图片描述
    此时我们完成了转换,可以看到我们得栈列表中的数据,然后把栈内的数据拿出来拼接成字符串。
    在这里插入图片描述
    在这里插入图片描述

    5.表达式树的拼装链接

    在这里插入图片描述

    1. And
      在这里插入图片描述
    2. Or
      在这里插入图片描述
    3. Not
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
  • 相关阅读:
    基于java的城市视频侦查管理系统设计与实现
    数据仓库的实际应用示例-广告投放平台为例
    数据仓库(8)数仓事实表和维度表技术
    发布自动化:Gradle发布插件的配置全攻略
    MyBatis-Plus 笔记(二)
    《安富莱嵌入式周报》第279期:强劲的代码片段搜索工具,卡内基梅隆大学安全可靠C编码标准,Nordic发布双频WiFi6 nRF7002芯片
    【冰糖Python】库安装 pip
    什么密码,永远无法被黑客攻破?
    Dubbo3入门实践,SpringBoot+Dubbo+Nacos+DubboAdmin
    商品推荐系统浅析
  • 原文地址:https://blog.csdn.net/liuwanying0226/article/details/128038457
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号