首页 > 其他分享 >Sy.ExpressionBuilder 也许会是动态查询的另一种实现方式

Sy.ExpressionBuilder 也许会是动态查询的另一种实现方式

时间:2024-08-13 23:26:45浏览次数:6  
标签:Sy IQueryable ExpressionBuilder 查询 QueryModel static 排序 public 属性

 

1.该表达式插件通过模型继承获取对应的能力。目前提供的模型有

  1. QueryModel :基础查询类

  2. PageModel:分页查询参数类(默认每页分页20条)

  3. FullQueryModel:查询模型,对比QueryModel 多了查询集合QueryItems和过滤FilterFields。前端可以在后端给与的基础上,添加查询参数,对于前端来说权限有点大,慎用(建议高级查询的时候用)。

  4. FullPageModel:查询模型,对比PageModel多了查询集合QueryItems和过滤FilterFields。慎用(原因同上)。

2.属性名约束

  1. 编号查询:编号查询最好是以Id结尾,不然如果编号为字符串的话,查询方式会以Contains形式查询。

  2. 时间格式:以 Start,End 结尾 ,生成条件为 >= 和<=。

  3. 数字范围:属性名称 以 Min,Max 结尾 ,生成条件为 >= 和<=。

  4. 字符串查询: 名字需要和表字段一致,生成条件为 Contains

3.特性约束。这部分主要为了弥补属性名的不足。可以使用特性ConditionAttribute。下面给出参数介绍以及使用例子。

  • 属性名:PropertyName

  • 属性值:Value

  • 查询方法:Condition

  • 查询类型:ConditionType(and/or)

  • 是否唯一属性名称:IsSinglePropertyName

  • 是否区分大小写:IsCaseSensitive

使用范例
  1. 导航父类查询:父类类名+英文符号.+父类的属性名。如

  [Condition($"{nameof(NewType)}.{nameof(NewType.Name)}")]
  public string Name { get; set; }
  1. 导航子类查询:子类类名+括号[子类属性名]。如

  [Condition($"{nameof(NewType)}[{nameof(NewType.Name)}]")]
  public string Name { get; set; }
  1. 默认的属性名不符合自己的规则的查询:例如字符串想要正值匹配,可通过特性配置

 [Condition("Role.RoleName", EnumCondition.Equal, EnumConditionType.And)]
  public string Name { get; set; }

4.排序处理

  1. 默认排序方法 DefaultOrderBy(string propName, bool isDesc = true, bool isClearReserved = true)。参数解析:属性名、降序升序、是否清掉之前的排序

  2. 默认排序方法 AddOrderBy(string propName, bool isDesc = true)。参数解析:属性名、降序升序。可添加多个,优先级按照,添加的顺序来。

/// <summary>
    /// 设置默认的排序条件,并清空之前保留的排序条件(如果isClearReserved为true)。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="propName">要排序的属性名。</param>
    /// <param name="isDesc">排序方向,true为降序,false为升序。</param>
    /// <param name="isClearReserved">是否清空之前保留的排序条件。</param>
    /// <returns>返回修改后的QueryModel实例。</returns>
    public static QueryModel DefaultOrderBy(this QueryModel input, string propName, bool isDesc, bool isClearReserved)
    {
         // 方法实现
    }
​
    /// <summary>
    /// 向QueryModel中添加一个排序条件。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="propName">要排序的属性名。</param>
    /// <param name="isDesc">排序方向,true为降序,false为升序。</param>
    /// <returns>返回修改后的QueryModel实例。</returns>
    public static QueryModel AddOrderBy(this QueryModel input, string propName, bool isDesc)
    {
         // 方法实现
    }
​
    /// <summary>
    /// 向QueryModel中添加两个排序条件。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="propName">第一个要排序的属性名。</param>
    /// <param name="isDesc">第一个排序的方向,true为降序,false为升序。</param>
    /// <param name="propName2">第二个要排序的属性名。</param>
    /// <param name="isDesc2">第二个排序的方向,true为降序,false为升序。</param>
    /// <returns>返回修改后的QueryModel实例。</returns>
    public static QueryModel AddOrderBy(this QueryModel input, string propName, bool isDesc, string propName2, bool isDesc2)
    {
          // 方法实现
    }
​
    /// <summary>
    /// 向QueryModel中添加三个排序条件。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="propName">第一个要排序的属性名。</param>
    /// <param name="isDesc">第一个排序的方向,true为降序,false为升序。</param>
    /// <param name="propName2">第二个要排序的属性名。</param>
    /// <param name="isDesc2">第二个排序的方向,true为降序,false为升序。</param>
    /// <param name="propName3">第三个要排序的属性名。</param>
    /// <param name="isDesc3">第三个排序的方向,true为降序,false为升序。</param>
    /// <returns>返回修改后的QueryModel实例。</returns>
    public static QueryModel AddOrderBy(this QueryModel input, string propName, bool isDesc, string propName2, bool isDesc2, string propName3, bool isDesc3)
    {
        // 方法实现
    }
    
    /// <summary>
    /// 向QueryModel实例中添加一组排序条件。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="orderByItems">包含排序信息的OrderByItem列表。</param>
    /// <returns>返回修改后的QueryModel实例(在空实现中,实际上只是返回传入的实例)。</returns>
    public static QueryModel AddOrderBy(this QueryModel input, List<OrderByItem> orderByItems)
    {
       // 方法实现
    }
​
    /// <summary>
    /// 向QueryModel实例中添加多个排序条件,所有条件使用相同的排序方向。
    /// </summary>
    /// <param name="input">当前的QueryModel实例。</param>
    /// <param name="isDesc">排序方向,true为降序,false为升序。</param>
    /// <param name="propNames">要排序的属性名数组。</param>
    /// <returns>返回修改后的QueryModel实例(在空实现中,实际上只是返回传入的实例)。</returns>
    public static QueryModel AddMultipleOrderBy(this QueryModel input, bool isDesc, params string[] propNames)
    {
         // 方法实现
    }

5.分组查询

  1. 使用特性GroupAttribute。使用分组序号,如Group(1)、如Group(1,EnumConditionType.Or)。

   [Group(1)]
   public string Name { get; set; }
    
   [Group(1, EnumConditionType.Or)]
   public string UserName { get; set; }

6.时间跨度查询约束

  1. 使用特性DurationAttribute。在时间的两个属性之间中的一个打上这个特性即可。如时间跨度三个月的。

    /// <summary>
    /// 创建时间 开始
    /// </summary>
    [Duration(3, EnumTimeType.Month)]
    public DateTime? CreateTimeStart { get; set; }
    /// <summary>
    /// 创建时间  结束
    /// </summary>
    public DateTime? CreateTimeEnd { get; set; }

7.分页配置

  1. 没啥好说的:PageIndex 当前页 ,PageSize 显示数。

8.参数忽略

  1. 提供了特性NotQueryAttribute,在对于属性添加即可忽略构建查询。

9.构建表达式

  1. 只要类继承了QueryModel等这四个模型,即可以通过ToExpression<TSource>(),构建对于自己模型的表达式。

10.查询扩展

  1. 常规扩展,根据传入的4大模型过滤。例如

 /// <summary>
    /// 查询扩展
    /// </summary>
    public static IQueryable<T> WhereExt<T>(this IQueryable<T> source, QueryModel input)
    {
        // 
    }
    /// <summary>
    /// 查询扩展,并排序
    /// </summary>
    public static IQueryable<T> WhereExt<T>(this IQueryable<T> source, Expression<Func<T,       bool>> expression, params OrderByItem[] orderByItems)
    {
      // 
    }  
  1. 部分查询扩展,可返回传入的模型类(如果属性匹配得上的话)

        /// <summary>
        /// Select扩展方法
        /// </summary>
        /// <typeparam name="TSource"></typeparam>
        /// <typeparam name="TTarget"></typeparam>
        /// <param name="query"></param>
        /// <returns></returns>
        public static IQueryable<TTarget> Select<TSource, TTarget>(this IQueryable<TSource> query)
        {
             
        }
  1. IQueryable扩展方法

/// <summary>
/// 根据QueryModel中的条件过滤IQueryable<T>并返回结果列表。 
/// </summary>
/// <param name="source">待处理的IQueryable<T>。</param>
/// <param name="input">包含过滤条件的QueryModel。</param>
/// <returns>未经过滤的T类型列表。</returns>
public static List<T> ToList<T>(this IQueryable<T> source, QueryModel input)
{
    // 实现
}

/// <summary>
/// 根据FullQueryModel中的复杂条件过滤IQueryable<T>并返回结果列表。 
/// </summary>
/// <param name="source">待处理的IQueryable<T>。</param>
/// <param name="input">包含复杂过滤条件的FullQueryModel。</param>
/// <returns>未经过滤的T类型列表。</returns>
public static List<T> ToList<T>(this IQueryable<T> source, FullQueryModel input)
{
    // 实现
}

/// <summary>
/// 根据PageModel中的分页参数对IQueryable<T>进行分页处理,并返回包含数据列表和总记录数的元组。
/// </summary>
/// <param name="query">待分页处理的IQueryable<T>。</param>
/// <param name="input">包含分页参数的PageModel。</param>
/// <returns>包含未分页数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) ToPageList<T>(this IQueryable<T> query, PageModel input)
{
    // 实现
}

/// <summary>
/// 根据FullPageModel中的分页和过滤条件对IQueryable<T>进行处理,并返回包含数据列表和总记录数的元组
/// </summary>
/// <param name="query">待处理的IQueryable<T>。</param>
/// <param name="input">包含分页和过滤条件的FullPageModel。</param>
/// <returns>包含未分页且未过滤的数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) ToPageList<T>(this IQueryable<T> query, FullPageModel input)
{
    // 实现
}

/// <summary>
/// 对IQueryable<T>进行分页处理,并返回包含数据列表和总记录数的元组。
/// </summary>
/// <param name="query">待分页处理的IQueryable<T>。</param>
/// <param name="input">包含分页参数的PageModel。</param>
/// <returns>包含未分页数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) Page<T>(this IQueryable<T> query, PageModel input)
{
    // 实现
}

/// <summary>
/// 根据FullPageModel中的分页和过滤条件对IQueryable<T>进行处理,并返回包含数据列表和总记录数的元组。
/// </summary>
/// <param name="query">待处理的IQueryable<T>。</param>
/// <param name="input">包含分页和过滤条件的FullPageModel。</param>
/// <returns>包含未分页且未过滤的数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) Page<T>(this IQueryable<T> query, FullPageModel input)
{
    // 实现
}
/// <summary>
/// 根据PageModel中的分页和排序参数对IQueryable<T>进行分页和排序处理,并返回包含排序后数据列表和总记录数的元组。
/// </summary>
/// <param name="query">待分页和排序处理的IQueryable<T>。</param>
/// <param name="input">包含分页和排序参数的PageModel。</param>
/// <returns>包含未分页且未排序的数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) OrderPageList<T>(this IQueryable<T> query, PageModel input)
{
    // 实现
}

/// <summary>
/// 根据FullPageModel中的分页、排序和过滤条件对IQueryable<T>进行处理,并返回包含排序后数据列表和总记录数的元组。
/// </summary>
/// <param name="query">待处理的IQueryable<T>。</param>
/// <param name="input">包含分页、排序和过滤条件的FullPageModel。</param>
/// <returns>包含未分页、未排序且未过滤的数据列表和未计算总记录数的元组。</returns>
public static (List<T> list, int total) OrderPageList<T>(this IQueryable<T> query, FullPageModel input)
{
    // 实现
}
  1. IQueryable扩展方法之排序

/// <summary>
/// 根据单个属性名对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="propName">要排序的属性名。</param>
/// <param name="isDesc">指示排序是否为降序。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, string propName, bool isDesc)
{
  // 实现
}

/// <summary>
/// 根据两个属性名对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="propName">第一个要排序的属性名。</param>
/// <param name="isDesc">第一个排序是否为降序。</param>
/// <param name="propName2">第二个要排序的属性名。</param>
/// <param name="isDesc2">第二个排序是否为降序。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, string propName, bool isDesc, string propName2, bool isDesc2)
{
  // 实现
}

/// <summary>
/// 根据三个属性名对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="propName">第一个要排序的属性名。</param>
/// <param name="isDesc">第一个排序是否为降序。</param>
/// <param name="propName2">第二个要排序的属性名。</param>
/// <param name="isDesc2">第二个排序是否为降序。</param>
/// <param name="propName3">第三个要排序的属性名。</param>
/// <param name="isDesc3">第三个排序是否为降序。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, string propName, bool isDesc, string propName2, bool isDesc2, string propName3, bool isDesc3)
{
  // 实现
}

/// <summary>
/// 根据多个属性名对IQueryable<TEntity>进行排序。属性名和排序方向通过数组提供。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="isDesc">是否所有排序都应为降序,此参数在可变参数场景下可能不被直接使用,而是作为方法重载的标识。</param>
/// <param name="propNames">要排序的属性名数组。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, bool isDesc, params string[] propNames)
{
  // 实现
}

/// <summary>
/// 根据IQueryModel中的排序信息对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="queryModel">包含排序信息的IQueryModel。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, IQueryModel queryModel)
{
   // 实现
}

/// <summary>
/// 根据OrderByItem数组中的排序项对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="orderByItems">包含排序属性和排序方向的OrderByItem数组。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, params OrderByItem[] orderByItems)
{
   // 实现
}

/// <summary>
/// 根据OrderByItem列表中的排序项对IQueryable<TEntity>进行排序。
/// </summary>
/// <param name="input">待排序的IQueryable<TEntity>。</param>
/// <param name="orderByItems">包含排序属性和排序方向的OrderByItem列表。</param>
/// <returns>未应用排序的IQueryable<TEntity>。</returns>
public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> input, List<OrderByItem> orderByItems)
{
   // 实现
}
 

 

标签:Sy,IQueryable,ExpressionBuilder,查询,QueryModel,static,排序,public,属性
From: https://www.cnblogs.com/noert/p/18357948

相关文章

  • 【MySQL】数据库约束和多表查询
    目录1.前言2.数据库约束2.1约束类型2.2 NULL约束2.3NUIQUE:唯一约束2.4 DEFAULT:默认值约束2.5 PRIMARYKEY:主键约束2.6FOREIGNKEY:外键约束1.7 CHECK约束3.表的设计 3.1一对一3.2一对多3.3多对多4.新增5.查询5.1聚合查询5.1.1聚合函数5.1.2 GROUPBY......
  • 【python】模块-标准库(sys,os,math,random)
    在python的基础知识这个板块里,我们上一篇文章讲到了模块的基础知识,那今天我们接着上次的话题来聊聊在python模块中标准库的知识。上次我们讲到了模块和包,而python自己呢也提供了不少的包和模块,我们称这些东西叫做标准库。python的标准库是会随着python解释器一同安装到你的电......
  • [lnsyoj2256]消除游戏
    题意给定序列\(a\),每次可以选择其中长度\(>m\)且完全相同的一段并删除,并将序列的剩余部分拼合成一段;或在任意位置插入一个数。求最终将序列\(a\)清空的最小操作数sol很显然,本题的插入操作是为了能够使一段数能够凑够\(m\)个,因此我们可以只考虑删除操作,只在操作上下手脚......
  • MySQL:复杂查询(二)——联合查询02
    本篇博客接上篇,上篇已讲联合查询部分知识:MySQL:复杂查询(一)——聚合函数&分组查询&联合查询01-CSDN博客目录1、联合查询1.1外连接1.1.1右外连接RIGHTJOIN1.1.2左外连接LEFTJOIN1.2自连接1.3子查询1.3.1单行子查询1.3.2多行子查询[NOT]IN1.3.3 多列......
  • EasyExcel导出图片(包含多张)
     主要pom<!--图片压缩缩略图--><dependency>  <groupId>net.coobird</groupId>  <artifactId>thumbnailator</artifactId>  <version>0.4.8</version></dependency><!--EasyExcel--><dependenc......
  • 《SQL 中复杂条件多表关联查询的性能优化秘籍》
    在当今数据驱动的时代,数据库的操作和查询性能对于企业的业务运营至关重要。当面对复杂的业务逻辑和大规模的数据时,实现复杂条件的多表关联查询并确保高效的性能成为了数据库开发者和管理员面临的重要挑战。多表关联查询是在关系型数据库中获取全面和准确数据的常见操作。然......
  • 数组拷贝System.arraycopy
    数组拷贝第一种方式:packagecom.coding.demo.concurrent;importjava.util.Arrays;/***使用Arrays.copyOf()*/publicclassTestArraysCopyOf{publicstaticvoidmain(String[]args){int[]src={1,2,3,4,5,6,7,8,9};int[]dest=Arrays......
  • 查询客户信贷额度使用情况
    FUNCTIONzfmsd_credit_to_bi.*"----------------------------------------------------------------------*"*"本地接口:*"EXPORTING*"VALUE(EV_TYPE)TYPEBAPI_MTYP*"VALUE(EV_MSG)TYPEBAPI_MSG*"TABLES*"......
  • [lnsyoj4079/luoguP6899]Pachinko
    题意一个包括空地、障碍和空洞的\(H\timesW\)地图,从第一列随机选取空地作为起始位置,到达某个空洞后停止运动。给定向上下左右移动的概率比\(p_u:p_d:p_l:p_r\),求在每个空洞停止运动的概率为多少。sol由于每次到达空洞后即会停止运动,因此到达空洞的期望次数即为到达每个空洞......
  • 【easyexcel自定义模版导出,字体样式设置】
    文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言学以致用,开箱即用一、maven引包<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version></dependency>......