首页 > 其他分享 >基于Expression Lambda表达式树的通用复杂动态查询构楗器——《摘要篇》

基于Expression Lambda表达式树的通用复杂动态查询构楗器——《摘要篇》

时间:2023-05-12 17:12:56浏览次数:40  
标签:lg Name 查询 Field 子句 构楗器 Op Expression Lambda

基于表达式树的通用查询构造器 常见的使用Linq Expression的做法这种代码众多,随便一搜就是, 但几乎都是单个条件的,单层级的,只能简单组装,组装成如:

Field_A =1 and Field_B =2 Or Field_C=3 
--或者 
Field_A =1 and (Field_B =2 Or Field_C=3)
 

是否可以灵活的查询条件组合 &独立的分离式的描述式条件,描述与执行分离的 &适应任何DTO的通用方案呢。

我们先来考查一个最简单的Sql where 子句: Id=1 当中有三种节点,分别为字段名:id,比较符:=,查询值:1 通过观察,我们用Name来标识字段名,Op来标识比较符,Value来标识查询值,那么数据结构可以设计为 :

{ "Name" : "id", "Op" : "=", "Value" : 1 }
 

再来考查具有两个条件的子句:

Id=1 and name="MyName" 
 

比上一条多了逻辑符:“and”,

那么我们添加两个节点,用Predicates来描述查询条件,用Lg来标识逻辑串接,数据结构可以设计为

 [ 
     {
      "lg" : "",
      	"Predicates" : {"Name" : "id", "Op" : "=", "Value" : 1 }
     },
     {
        "lg":"and",
      	"Predicates": { "Name" : "Name", "Op" : "=", "Value" : "MyName"}
     } 
 ] 
 

以下两条子句都比较常用,也都属于简单的子句,再来看稍微复杂点儿的子句:

Id>1 and Id<10 and (Name="MyName" or Name="HisName")
 

比上一条多了一对分组括号: 添加节点filters来容纳逻辑组合,数据结构可以设计为:

 { 
     "lg": "", 
     	"filters":
	[ 
		{ 
			"lg": "", 
          		"Predicates":[ { "lg": "", "Name": "id", "Op": ">", "Value": 1 } ]
         	}, 
         	{ 
			"lg": "and", 
          		"Predicates":[ { "lg": "", "Name": "id", "Op": "<", "Value": 10 } ] 
         	},
            	{
                	"lg": "and",
                	"Predicates":
            		[
                        	{"lg": "","Name": "name",  "Op": "=", "Value": "MyName"},         
                        	{"lg": "or","Name": "name","Op": "=","Value": "HisName"}
        		]
    		}
	]
}
 
--更复杂一点的等等:
Id=1 
 and (
     (Name="MyName" or Name="HisName") or (Phone like"13899%" and Emil Like "%@xx.com")
 )
 

基于此,期望能够以简洁的方式:

Query.Where(QueryFilterBuilder.CreateFilterExpression<Entity>(conditionBlock));

实现如下复杂的查询组合的复杂查询构建器:

where 
    ( 
        (            
            (A.Field_A + A.Field_B) / A.Field_C=(2+3) % 2 or A.Field_A= A.Field_C
			or (A.Field_C > 2 and Len(A.Field_D) < 2)
        ) 
        and (A.Field_E Like"%xxooxx" or A.Field_F in (1,2,3))
    ) 
    and A.Field_G in (select B.Field_N From B where cast(B.Fieild_DatetimeString as Datetime) = A.FieldDatetime)
)

如上所示,几乎可以实现任意条件,任意逻辑的组合查询。

理想这么美好,那么现实如何去实现,我们设计一个用来描述条件的对象:ConditionBlock用来承载上述查询条件的数据结构,再设计一个条件分析构造器:QueryFilterBuilder,使用它来创建Expression表达式树以构造Lambda查询表达式,由于条件描述与表达式构造分离,条件描述的工作可以放在任何地方,比如浏览器,它可以只需要提供符合数据结构的Json数据即可。

先看看总体代码:

https://github.com/ls0001/QueryFilter(别忘记随手点亮一颗小星星哦/^.^)

欲了解更多,挖掘更多,敬待下期分解。

 

标签:lg,Name,查询,Field,子句,构楗器,Op,Expression,Lambda
From: https://www.cnblogs.com/ls0001/p/17395510.html

相关文章

  • Spring表达式(Spring Expression Language,SpringEL)官方文档
    SpringEL是一个强大的表达式语言,支持在运行时查询和操作对象图。官方地址:https://docs.spring.io/spring-framework/docs/5.3.18/reference/html/core.html#expressions需要引入依赖:<dependency><groupId>org.springframework</groupId><artifactId>spring-expression</......
  • 使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中
    >作者:[SRE运维博客](https://www.cnsre.cn/)>博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/)>文章地址:[https://www.cnsre.cn/posts/221205544069/](https://www.cnsre.cn/posts/221205544069/)>相关话题:[https://www.cnsre.cn/tags/aws/](https://www.cnsr......
  • 现代 C++:Lambda 表达式
    Lambda表达式(LambdaExpression)是C++11引入的一个“语法糖”,可以方便快捷地创建一个“函数对象”。从C++11开始,C++有三种方式可以创建/传递一个可以被调用的对象:函数指针仿函数(Functor)Lambda表达式函数指针函数指针是从C语言老祖宗继承下来的东西,比较原始,功能也比......
  • C++ Lambda表达式的完整介绍
    c++在c++11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码更加灵活简洁。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。什么是Lambda表达式最常见的lambda的表达式写法如下autoplus=[](intv1,int......
  • C++11 lambda表达式精讲
    lambda表达式是C++11最重要也最常用的一个特性之一,C#3.5和Java8中就引入了lambda表达式。 lambda来源于函数式编程的概念,也是现代编程语言的一个特点。C++11这次终于把lambda加进来了。 lambda表达式有如下优点:声明式编程风格:就地匿名定义目标函数或函数对......
  • lambda表达式运用 ----demo
    点击查看代码publicclasstest{publicstaticvoidmain(String[]args){List<User>list=newArrayList<>();list.add(newUser(21L,"张三"));list.add(newUser(25L,"李四"));list.add(newUser(22......
  • python 小技巧, 列表生成式比 filter(lambda x:x>=0,data) 快, iteritems()方法,
    题目经timeit测试列表生成式比filter(lambdax:x>=0,data)快python2的dict的iteritems()方法,pyhton3可以看看有没有......
  • lambda表达式
    [capturelist](parameterlist)->returntype{functionbody;};capturelist捕获列表[]//没有定义任何变量。使用未定义变量会引发错误。[x,&y]//x以传值方式传入(默认),y以引用方式传入。[&]//任何被使用到的外部变量都隐式地以引用方式加以引用。[=]//......
  • C# Lambda表达式select()和where()的区别
    1、where()用法:必须加条件,且返回对象结果。string[]arrays={"asd","abc","bbb","ccc"};varresults=arrays.Where(a=>a.Contains("b"));//必须加条件,返回对象2、select()用法:(1)(a=>a.Value=="22")加条件查询时,返回bool型结果;(2)(a=......
  • AWS Serverless Lambda Function架构设计的几种方式
    如何构建大型Serverless应用从路由方式上,Lambda大致可以分为三种架构方式1:单体应用式这种方式和传统RESTAPI很相似,以nodejs为例,在service内部使用express框架作路由,如下图所示代码示例如下constexpress=require('express')constapp=express()app.listen(80,()=>......