上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢?

再次回顾考察,看下面的查询子句:

Id>1 and Id<10

如上所示,有两个独立的条件分别为Id>1Id<10,用一个逻辑操作符 and 连接起来。

再看下面这条,后面也是两个独立条件通过操作符or连接,并包在括号里,作为一个整体

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

可以看到当中包含几种元素:字段名称,逻辑操作符,比较操作符,条件值,数据类型,括号。两个概念:独立的条件和由括号包将它们起来的整体。

那么可以设计两个类来代表独立条件和条件组,如下所示:

//独立条件伪代码:
public class Field
{
   public  enum Logical {get;set;}      //与其它条件之间的逻辑关系  
   public  enum comparer {get;set;}      //条件比较符
   public  Type DataType {get;set;}      //数据类型
   public  string FieldName {get;set;}  //字段名称
   public  object QueryValue {get;set;}  //条件值
}

由于复杂的查询的括号是可嵌套的,多重组合的,类似下面的还算简单的子句:

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

那么条件组里就需要包含独立条件和条件组,并且可嵌套,即组中有组:

//条件组伪代码:
public class Block
{
   public  enum Logical {get;set;}      //与其它条件组或独立条件之间的逻辑关系  
   public  List<Field> Fields {get;}
   public  List<Block> Blocks {get;}
}

光文字看得似乎容易蒙逼,来张图或者能辅助理解(图示仅用来说明分组的层次):

  • 至此,把查询条件用代码描述出来的构思就暂告一段落了。

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

  • 随手点个赞呗!
  • 下集预告。。。。。如何得到目标表达式

基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》的更多相关文章

  1. 定义通用的可通过lambda表达式树来获取属性信息

    我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...

  2. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  3. 用lambda表达式树替代反射

    本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...

  4. C# Lambda表达式详解,及Lambda表达式树的创建

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  5. EntityFramework动态多条件查询与Lambda表达式树

              在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...

  6. 动态拼接lambda表达式树

    前言 最近在优化同事写的代码(我们的框架用的是dapperLambda),其中有一个这样很普通的场景——界面上提供了一些查询条件框供用户来进行过滤数据.由于dapperLambda按条件查询时是传入表 ...

  7. 将简单的lambda表达式树转为对应的sqlwhere条件

    1.Lambda的介绍 园中已经有很多关于lambda的介绍了.简单来讲就是vs编译器给我带来的语法糖,本质来讲还是匿名函数.在开发中,lambda给我们带来了很多的简便.关于lambda的演变过程可 ...

  8. Lambda表达式树解析(下)

    概述 前面章节,总结了Lambda树的构建,那么怎么解析Lambda表达式树那?Lambda表达式是一种委托构造而成,如果能够清晰的解析Lambda表达式树,那么就能够理解Lambda表达式要传递的正 ...

  9. Lambda表达式树构建(上)

    概述 Lambda是C#常用的语句,采用委托等方式,来封装真实的代码块.Lambda其实就是语法糖,是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可 ...

  10. Lambda表达式树

    1.常量表达式树 Func< + ); 使用表达式树的方式 ConstantExpression a = Expression.Constant(); ConstantExpression b ...

随机推荐

  1. odoo 开发入门教程系列-安全-简介

    安全-简介 前一章中我们已经创建了第一个打算用于存储业务数据的表.在odoo这样的一个商业应用中,第一个考虑的问题就是谁(Odoo 用户(或者组用户))可以访问数据.odoo为指定用户组用户提供了一个 ...

  2. 免费1年服务器,部署个ChatGPT专属网页版

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...

  3. 多线程结合自定义logback日志实现简单的工单日志输出

    前言 这周学习了logback自定义日志格式.多线程基础.以及常见的定时器,本篇博客主要是结合以上知识实现一个简单的定时全部工单输出任务,再通过自定义的日志打印输出到控制台. 1.logback自定义 ...

  4. 如何在2023年学习React

    在2023年学习React并不是一件容易的事情.自2019年React Hooks发布以来,我们已经拥有了很多稳定性,但现在形势正在再次变化.而这次变化可能比使用React Hooks时更加不稳定.在 ...

  5. linux shell 自动化部署 npm vue 项目

    此 shell 是提供给前端登录服务器自动化部署 vue 项目的 用此命令,工具化部署项目,可以杜绝前端自己部署项目时,对服务器违规操作 如有其它问题,可在下方留言! #!/bin/sh # url: ...

  6. 帝国cms 随机调取新闻

    <?php $hits_r = $empire->query("select * from {$dbtbpre}ecms_music as t1 join (select rou ...

  7. 基于Python的爬虫案例

    案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...

  8. 家用wife密码设置

    1.在浏览器上面输入ip地址:http://192.168.1.1/或http://192.168.0.1/出现路由器登陆窗口输入用户名跟密码.用户名默认一般为:admin,密码为空或为:admin ...

  9. node使用react项目启动错误TSError: ⨯ Unable to compile TypeScript:

    1.错误内容 return new TSError(diagnosticText, diagnosticCodes) ^ TSError: ⨯ Unable to compile TypeScript ...

  10. 数据分析01-(numpy概述及使用)

    数据分析-01 数据分析 numpy numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 nd ...