基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

这篇具有很好参考价值的文章主要介绍了基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接续[上篇之预告]

本篇来讲讲,如何根据前面设计的查询描述器构造出可执行的表达式。正如标题所示,实现手段将采用Expression Lambda技术。

先来看看主角System.Linq.Expressions.Expression 长什么样,都有些什么东西,能做什么。 先看看它的类图:

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源

  • 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就可以看到了.
    */

 文章来源地址https://www.toymoban.com/news/detail-460687.html

  • OK,其它各种操作,只要依葫芦画瓢便大功可成! 先爽一下!
  • 好,暂且爽到这里,欲看如何把括号弄成俄罗斯套娃,且看下回分解.
  • 随手点个赞,让我也爽爽,可好!

到了这里,关于基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇二》已开源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【c#表达式树】最完善的表达式树Expression.Dynamic的玩法

    在我第一次写博客的时候,写的第一篇文章,就是关于表达式树的,链接:https://www.cnblogs.com/1996-Chinese-Chen/p/14987967.html,其中,当时一直没有研究Expression.Dynamic的使用方法(因为网上找不到资料),就了解到是程序运行时动态去构建表达式树,举个例子,例如我们需要在我们的

    2023年04月11日
    浏览(28)
  • Python正则表达式Regular Expression初探

    目录 Regular 匹配规则 单字符匹配  数量匹配 边界匹配  分组匹配 贪婪与懒惰 原版说明 特殊字符 转义序列 模块方法 函数说明 匹配模式 常用匹配规则 1. 匹配出所有整数 2. 匹配11位且13开头的整数 Python的re模块提供了完整的正则表达式功能。正则表达式(Regular Expression)是一

    2024年01月22日
    浏览(36)
  • oracle的正则表达式(regular expression)

    当前,正则表达式已经在很多软件中得到广泛的应用,包括Linux, Unix,HP等操作系统,PHP,C#,Java等开发环境,ORACLE则在10G中推出了自己的正则表达式。 Oracle 10g正则表达式提高了SQL灵活性,有效的解决了数据有效性, 重复词的辨认, 无关的空白检测,或者分解多个正则组成的

    2024年02月07日
    浏览(34)
  • 表达式树(Expression)的执行、解释与创建

    前言:在这里不进行概念性描述,能看到这篇文章说明你已经知道如何使用表达式树 这里需要说明下表达式树是表示代码的数据结构,并不是经过编译且可执行的代码,如果想要执行由表达式树表示的 .NET 代码,必须将其转换为可执行的 IL 指令。这时候我们需要调用编译函

    2024年02月22日
    浏览(26)
  • C#Regex正则表达式(Regular Expression)

    在C#中,Regex是正则表达式(Regular Expression)的缩写,它是一种强大的文本匹配和处理工具。正则表达式是一种用于描述模式的字符串,它可以用来在文本中查找、替换和提取满足特定模式的内容。 在C#中,你可以使用System.Text.RegularExpressions命名空间下的Regex类来操作正则表达

    2024年02月05日
    浏览(31)
  • 数据结构——基于二叉树的表达式求值算法

    1.输入一个表达式(表达式中的数均小于10的正整数),利用二叉树来表示该表达式,创建表达式数,然后利用二叉树的遍历操作求表达式的值。 2.输入要求:多组数据,每组数据1行,为一个表达式,表达式以“=”结尾。当输入只有一个“=”时,输入结束。 3.输出要求:每组

    2024年02月04日
    浏览(36)
  • 【javaSE】 Lambda表达式与Lambda表达式的使用

    Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression) ,基于数学中的λ演算得名,也

    2024年02月08日
    浏览(50)
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口         1.4 在具体代码中来操作一下         2.0 Lambda 表达式省略规则          Lambda 表达

    2024年02月08日
    浏览(44)
  • 【P15】JMeter 正则表达式提取器(Regular Expression Extractor)

    接口需要关联时,可以通过正则表达式提取所需要的值 右键 添加 后置处理器 正则表达式提取器(Regular Expression Extractor) Apply to Main sample and sub-samples:匹配范围包括当前父取样器并覆盖子取样器 Main sample only:默认;匹配范围是当前父取样器 Sub-samples only :仅匹配子取样器

    2024年02月07日
    浏览(32)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包