基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》

Posted ls0001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》相关的知识,希望对你有一定的参考价值。

还在一行一行地手撸查询代码吗?有没有想过全自动的,通用的,免写代码的动态查询?上一篇简略讲了构造出可执行的表达式的原型实现,本篇来剧透一下多层嵌套查询Expression Lambda表达式的动态自动构建完之后有什么用法。

前篇《https://www.cnblogs.com/ls0001/p/17437225.html》有大佬在评论里剧透了,这里就来一遍剧透。

  通常,前后端分离的系统要在前端查询数据是提交一个带着查询条件参数的表单,比如A=1,B=2,类似样,后端接收到表单需要将这些条件参数拼接成查询需要写代码,并且表单结构通常是不带查询逻辑属性的,只能用and来联接这些条件,给查询的灵活性带来了局限。

本框架就是要提供更灵活的,后端不需要写代码的一个查询能力。

其中一个主要的应用场景正是实现实现只需前端传递JSON格式的查询条件到后端,后端无需写查询代码就能进行查询。

其流程如下图所示:

举个例子:

前端提交来的查询JSON:

  
     "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"
            ]
        
    ]

 

后端只要如下代码就可以了:

Query.Where(QueryFilterBuilder.CreateFilterExpression<Entity>(上面的JSON));
​

 

尽管前端JSON的构造也需要一个轮子,后续再说,本篇暂且先到这。

 

python's lambda expression

lambda 函数的语法只包含一个语句,表现形式如下:

lambda [arg1 [,arg2,.....argn]] : expression

expression 是一个参数表达式,表达式中出现的参数需要在 [arg......] 中有定义,并且表达式只能是单行的,只能有一个表达式

lambda的特性:

   1)lambda 函数是匿名的:lambda函数没有名字。

   2)lambda 函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。

   3)lambda 函数拥有自己的命名空间:不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。

下面来看个例子:

myAdd = lambda x, y: x + y
print(myAdd(10, 20))

 

以上是关于基于Expression Lambda表达式树的通用复杂动态查询构建器——《剧透一下》的主要内容,如果未能解决你的问题,请参考以下文章

关于Expression表达式树的拼接

Lambda 到表达式树的转换

python's lambda expression

表达式树 Expression Trees

java Lambda expression

Expression.Call 在简单的 lambda 表达式中。可能吗?