CURD中,基础查询我感觉还是很烦人的一个浪费时间的工作,我经历过远古时代的GetAll(string name,int age),这种方式写服务的时候真的是心中一万个草泥马飞过,后面逐渐的变成了传一个实体GetAll([FromQuery] GetDto)似乎也能默默的忍受,然后含泪写着一堆的WhereIf,目前这种方式应该还是很多人在用的一种方式。作为新生代的农民工,我们是自然不能忍受一直这样,于是就有Sy.ExpressionBuilder(大家可以去nuget下载试用)这个查询插件,似乎我们有了更好的选择。

为了方便后面的介绍,先让我们有几个实体,用户表,角色表,系统表,我们约定一个用户只有一种角色,但是可以存在多个系统中。

 /// <summary>
/// 用户表
/// </summary>
public class Manager
{
/// <summary>
/// 编号
/// </summary>
public string Id { get; set; } /// <summary>
/// 名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 手机
/// </summary>
public string Tel { get; set; } /// <summary>
/// 角色编号
/// </summary>
public string RoleId { get; set; } /// <summary>
/// 角色
/// </summary>
public Role Role { get; set; } /// <summary>
/// 系统
/// </summary>
public List<Sys> Sys { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; } /// <summary>
/// 性别
/// </summary>
public EnumGender Gender { get; set; }
}
/// <summary>
/// 角色表
/// </summary>
public class Role
{
/// <summary>
/// 角色名
/// </summary>
public string RoleName { get; set; } /// <summary>
/// 角色编号
/// </summary>
public string Id { get; set; } }
    /// <summary>
/// 系统表
/// </summary>
public class Sys
{
/// <summary>
/// 系统名称
/// </summary>
public string SysName { get; set; } /// <summary>
/// 编号
/// </summary>
public string Id { get; set; }
}
    /// <summary>
/// 性别
/// </summary>
[Flags]
public enum EnumGender
{
/// <summary>
/// 男
/// </summary>
Man = 1 << 0, /// <summary>
/// 女
/// </summary>
Women = 1 << 1,
}

然后我们先创建张三李四两个小伙伴

            List<Manager> list = new List<Manager>();
List<Sys> Sys = new List<Sys>();
List<Sys> Sys2 = new List<Sys>();
Sys.Add(new Tests.Sys { Id = "1", SysName = "仓管系统" });
Sys.Add(new Tests.Sys { Id = "2", SysName = "人力资源系统" });
Sys2.Add(new Tests.Sys { Id = "1", SysName = "仓管系统" }); list.Add(new Manager { Id = "1", UserName = "张三", Tel = "18888888888", Gender = EnumGender.Man, RoleId = "1", CreateTime = DateTime.Parse("2021-9-22 10:50:50"), Sys = Sys, Role = new Role { RoleName = "超级管理员", Id = "1" } });
list.Add(new Manager { Id = "2", UserName = "李四", Tel = "16666666666", Gender = (EnumGender)3, RoleId = "2", CreateTime = DateTime.Parse("2021-9-21 10:50:50"), Sys = Sys2, Role = new Role { RoleName = "管理员", Id = "2" } });

数据结构图

在做查询前先让我们定义查询的Dto

 /// <summary>
/// 查询参数实体
/// </summary> public class AllManagerDto : QueryPageModel
{
/// <summary>
/// 创建时间 开始(时间必须以Start结尾)
/// </summary>
public DateTime? CreateTimeStart { get; set; } /// <summary>
/// 创建时间 结束(结束时间必须以End结尾)
/// </summary>
public DateTime? CreateTimeEnd { get; set; }
        /// <summary>
/// 创建时间(或者使用特性,约定方式)传值为("2021-9-21,2021-10-7")中间用,分割
/// </summary>
[Condition("CreateTime", EnumCondition.Between)]
public string CreateTime { get; set; }

/// <summary>
/// 角色编号
/// </summary>
[Condition("Role.Id", EnumCondition.In)]
public string RoleId { get; set; } /// <summary>
/// 角色名称
/// </summary> [Condition("Role.RoleName", EnumCondition.Contains)] public string RoleName { get; set; } /// <summary>
/// 系统名称
/// </summary> [Condition("Sys[SysName]", EnumCondition.Contains)] public string SysName { get; set; } /// <summary>
/// 名称
/// </summary>
public string UserName { get; set; } /// <summary>
/// 性别
/// </summary> public EnumGender? Gender { get; set; } [NotMapped]
public string AA { get; set; }
        /// <summary>
/// 年龄 开始(必须以Min结尾)
/// </summary>
public int? AgeMin { get; set; } /// <summary>
/// 年龄 结尾(必须以Max结尾)
/// </summary>
public int? AgeMax{ get; set; }

    }

我们来做一个简单的单表查询,查询完全满足,名字叫张三,号码为 18888888888,性别男,角色编号为“1”的,创建时间 大于 "2021-9-22" 的用户。我们只需要一句话就可以了,想想你以前的得写多少语句。

我们默认有以下约定 时间格式范围为 <=和>= ,数字 int decimal double等为 <=和>=,string 为包含

  /// <summary>
/// 单表查询
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static List<Manager> GetAll(AllManagerDto input)
{
var list = GetList();
input.RoleId = "1";
input.Tel = "18888888888";
input.UserName = "张三";
input.Gender = EnumGender.Man;
input.CreateTimeStart = DateTime.Parse("2021-9-22"); var query = input.ToQueryModel<Manager>();
return list.AsQueryable().Where(query).ToList();
}

我们看看效果

生成的表达式

返回结果,是不是很神奇。

那如果我们要关联表查询呢,怎么破,别急,看下面代码

       /// <summary>
/// 角色名称
/// </summary> [Condition("Role.RoleName", EnumCondition.Contains)] public string RoleName { get; set; } /// <summary>
/// 系统名称
/// </summary> [Condition("Sys[SysName]", EnumCondition.Contains)] public string SysName { get; set; }

我们使用 Condition 特性,标识 Role.RoleName 表示 查询Role下 RoleName 等于我们要查的数据,Sys[SysName]  表示用户表下Sys数组下名称为SysName 的条件

这就基本包含了我们所用到的情况。你是不是觉得漏了点什么,我们要处理排序怎么处理,别急,我们内置了添加排序的方法,我们还可以添加多个,完美把

  /// <summary>
/// 添加排序条件
/// </summary>
/// <returns></returns>
public static BaseQueryModel AddOrderByItem(this BaseQueryModel queryModel, string propName, bool isDesc = true)
{
queryModel.OrderByItems.Add(new OrderByItem { PropName = propName, IsDesc = isDesc });
return queryModel;
}

还有个分组的特性,等有人问再说.......

												

最新文章

  1. SQL Server 数据库的维护(三)__事务(transaction)和锁
  2. 那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传
  3. ios 实现版本更新检查
  4. BZOJ 4004 装备购买
  5. Dagger2学习资源
  6. hadoop中hbase出现的问题
  7. LoadRunner Tutorial
  8. java.text.NumberFormat使用方法
  9. jQuery第四章
  10. WAS应用--虚拟主机
  11. [2017-2018上Java助教]个人信息收集
  12. 使用TensorFlow中的Batch Normalization
  13. TCP连接建立系列 — 客户端的端口选取和重用
  14. 实验五:任意输入10个int类型数据,排序输出,并找出素数
  15. (转载)sqlmap用户手册详解
  16. storm自定义分组与Hbase预分区结合节省内存消耗
  17. python tkinter-窗体
  18. 一步步创建第一个Docker App —— 4. 部署应用
  19. 【DB2】索引
  20. SQL Server - 文件组,文件,备份,分区

热门文章

  1. mysql数据库备份脚本一例
  2. Springboot(1) helloworld 搭建环境
  3. 拷贝txt文本中的某行的数据到excel中
  4. 使用Stream方式处理集合元素
  5. 远程调用RPC
  6. Jenkins触发构建
  7. Jenkins pipeline声明式语法
  8. [BUUCTF]PWN——jarvisoj_level1
  9. Oracle 函数高级查询
  10. let, const用法以及与var的区别