首页 > 其他分享 >怎样优雅地增删查改(九):按日期范围查询

怎样优雅地增删查改(九):按日期范围查询

时间:2023-07-24 12:56:16浏览次数:38  
标签:CreationTime 查询 var 查改 filteredInput 增删 query 优雅 Expression

目录

 

使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。

实现

定义按创建日期范围查询(IDateSpanOrientedFilter)接口。

遵守接口隔离原则,将IDateSpanOrientedFilter接口拆分为IStartDateOrientedFilter和IEndDateOrientedFilter接口。

public interface IDateSpanOrientedFilter : IStartDateOrientedFilter, IEndDateOrientedFilter
{

}

按开始日期查询接口定义如下:

public interface IStartDateOrientedFilter
{
    DateTime? StartDate { get; set; }
}

结束日期接口定义如下:

public interface IEndDateOrientedFilter
{
    DateTime? EndDate { get; set; }
}
  • StartDate:开始日期,记录的CreationTime 大于等于 该日期的记录将被筛选
  • EndDate:用户Id,记录的CreationTime 小于 该日期的记录将被筛选

按开始日期查询

创建应用过滤条件方法:ApplyStartDateOrientedFiltered,在此实现拼接LINQ表达式,代码如下:

protected virtual IQueryable<TEntity> ApplyStartDateOrientedFiltered(IQueryable<TEntity> query, TGetListInput input)
{
    if (input is IStartDateOrientedFilter && HasProperty<TEntity>("CreationTime"))
    {
        var property = typeof(TEntity).GetProperty("CreationTime");
        var filteredInput = input as IStartDateOrientedFilter;
        if (filteredInput != null && filteredInput.StartDate.HasValue)
        {
            Expression originalExpression = null;
            var parameter = Expression.Parameter(typeof(TEntity), "p");

            var dateConstantExpression = Expression.Constant(filteredInput.StartDate.Value, typeof(DateTime));

            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            var expression = Expression.GreaterThanOrEqual(propertyAccess, dateConstantExpression);

            var equalExpression = expression != null ?
                    Expression.Lambda<Func<TEntity, bool>>(expression, parameter)
                    : p => false;


            query = query.Where(equalExpression);

        }

    }
    return query;
}


按结束日期查询

创建应用过滤条件方法:ApplyEndDateOrientedFiltered,在此实现拼接LINQ表达式,代码如下:

protected virtual IQueryable<TEntity> ApplyEndDateOrientedFiltered(IQueryable<TEntity> query, TGetListInput input)
{
    if (input is IEndDateOrientedFilter && HasProperty<TEntity>("CreationTime"))
    {
        var property = typeof(TEntity).GetProperty("CreationTime");
        var filteredInput = input as IEndDateOrientedFilter;
        if (filteredInput != null && filteredInput.EndDate.HasValue)
        {
            Expression originalExpression = null;
            var parameter = Expression.Parameter(typeof(TEntity), "p");

            var dateConstantExpression = Expression.Constant(filteredInput.EndDate.Value, typeof(DateTime));

            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            var expression = Expression.LessThan(propertyAccess, dateConstantExpression);

            var equalExpression = expression != null ?
                    Expression.Lambda<Func<TEntity, bool>>(expression, parameter)
                    : p => false;


            query = query.Where(equalExpression);

        }

    }
    return query;
}

请注意,可应用过滤的条件为:

  1. input需实现IDateSpanOrientedFilter或子接口;
  2. 实体必须包含“CreationTime”字段。

否则将原封不动返回IQueryable对象。

使用

无需在应用层中更改代码,

在GetAllAlarmInput中实现IDateSpanOrientedFilter接口,代码如下:

public class GetAllAlarmInput : PagedAndSortedResultRequestDto, IDateSpanOrientedFilter
{
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }

    ...
}

至此,所有的通用查询接口已实现完成。在这个项目中,我实现了适合我的联合查询方式,你可以根据实际业务需求,扩展和调整查询实现。

项目地址

Github:general-curd-sample

本文来自博客园,作者:林晓lx,转载请注明原文链接:https://www.cnblogs.com/jevonsflash/p/17574382.html

标签:CreationTime,查询,var,查改,filteredInput,增删,query,优雅,Expression
From: https://www.cnblogs.com/wl-blog/p/17576947.html

相关文章

  • 怎样优雅地增删查改(九):按日期范围查询
    目录实现按开始日期查询按结束日期查询使用项目地址使用数据库的创建时间作为查询依据,在Abp框架中,实体类实现ICreationAuditedObject接口,或继承CreationAuditedEntity类,使用仓储创建记录时将自动生成CreationTime。实现定义按创建日期范围查询(IDateSpanOrientedFilter)接口。遵......
  • 周六 jdbc练习 商品品牌数据增删改查
    先把练习用的表建立出来droptableifexiststb_brand;--创建tb_brand表createtabletb_brand(--id主键idintprimarykeyauto_increment,--品牌名称brand_namevarchar(20),--企业名称company_namevarchar(20),--......
  • SpringBoot系列---【StopWatch优雅实现统计代码耗时】
    StopWatch优雅实现统计代码耗时#org.springframework.util.StopWatchStopWatchstopWatch=newStopWatch();stopWatch.start("task1");//逻辑代码1...stopWatch.stop();log.debug("task1执行耗时:{}ms",stopWatch.getLastTaskTimeMillis());stopWatch.start("......
  • 让代码优雅起来:记一次代码微重构实践
    一、需求开发修改代码一次需求开发时碰到如下所示方法代码:privateOrderShoudSettlementAmountgetOrderShoudSettlementAmount(OrderDTOorderMain,List<SettlementDetail>details){OrderShoudSettlementAmountsettlementAmount=newOrderShoudSettlementAmount();......
  • K8s系列---【K8s如何配置优雅停机?】
    K8s如何配置优雅停机?应用部署在k8s中,需要设置pod的优雅停机时间(terminationGracePeriodSeconds),一般大于应用程序中spring.lifecycle.timeout-per-shutdown-phase设置的超时时间;设置之后服务更新或者重启时k8s会捕获到1号进程,在等待应用程序优雅关闭后,再杀死pod,从而减少对业务的......
  • PHP 优雅的发起 http 请求
    <?phpfunctionsendPostRequest($url,$data){//初始化cURL$curl=curl_init();//设置cURL选项curl_setopt($curl,CURLOPT_URL,$url);curl_setopt($curl,CURLOPT_POST,true);curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($......
  • JavaScript 的优雅编程技巧:Singleton Pattern
    JavaScript的优雅编程技巧:SingletonPattern定义单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点。特点仅有一个实例对象全局都可访问该实例主动实例化延迟实例化类似单例模式的使用实践jQuery,lodash,moment....电商中的购物车(因为一个用户只有一......
  • 怎样优雅地增删查改(八):按用户关系查询
    @目录原理实现正向用户关系反向用户关系使用测试用户关系(Relation)是描述业务系统中人员与人员之间的关系,如:签约、关注,或者朋友关系。之前我们在扩展身份管理模块的时候,已经实现了用户关系管理,可以查看本系列博文之前的内容。怎样优雅地增删查改(二):扩展身份管理模块原理查询依据......
  • 【测试联调】如何在前后端测试联调时优雅的构造异常场景
    背景当前的应用都使用了前后端分离的架构,前后端系统需要协同以实现各种功能。后端系统通常负责处理业务逻辑、数据存储和与其他服务的交互,而前端则负责用户界面和用户交互。而在前后端数据交互的过程中,各种异常和错误都有可能发生,确认异常发生时前后端系统的处理是否合理是测试验......
  • jfinal 框架学习笔记-第三天 Model相关学习--record+Model增删改查的用法(震惊之今日刷
    1.了解了数据库连接池。其中使用最多也是最广泛的是druid数据库连接池也就是阿里云研发的数据库连接池2.ActiveRecord(jFinal的核心技术)+DruidPlugin(数据库连接词,如何与数据库打交道)ActiveRecord:1.Record(记录,相当于一个通用的Model),2.Model(提供日常CRUD的封装)Model示例......