• 用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET


    架框介绍

    SqlSugar是一款.NET老牌ORM 并且也是 新手基数比较多的ORM(因为上手容易),SqlSugar之所以能一直更新到现在,还是要感谢SqlSugar的忠实用户,随着我的技术越来越好,加上用户量越来越多,我也越来越勤快,功能也越来越注重细节

    查询体系

    用开源框架最怕遇到的就是想用一个功能发现没有,这个有时候就会非常麻烦,或者有这个功能发现不好用,SqlSugar是经过7年来真实的需求量身定制的,可以说在功能方面都比

    EF CORE更加实用也不为过,一图看懂 SqlSugar查询功能

    基础查询

    基础查询 查询单条、主键查询、查所有、模糊查询、排序、TOP 、Count、IN等等操作
    分页查询 分页查询
    分组查询 分组查询和去重复  Group by   Distinct
    排序  Order by  、随机排序、动态排序

    多表查询

    联表查询 使用Left Join  Inner Join进行查询
    配置查询 简化联表操作,解决字典联表和简单Name联表问题

    子查询

    2个Queryable Join

    查询中套查询,2个结果集进行JOIN等操作
    导航查询 一对多 、一对一、多对多操作 ,有层级的查询
    并集查询 Union all
    树型查询 查询出一个树形结构,比如菜单

    业务查询

    无实体查询 没有实体查询
    表格查询 前端组装好查询条件,后台直接使用
    全局过滤器 比如很多地方用到假删除,那么我们可以配置加上IsDeleted
    多库查询 如果表结构一样,那我们可以用一个实体操作不同表

    高级功能

    二级缓存 支持Redis等缓存,让你不需要维护 CacheKey轻松使用缓存来提高服务器性能
    异步查询  使用异步进行查询
    Sqlfun函数 使用SqlSugar自带的数据库函数查询
    扩展Sql函数 当有些ORM不能解析的功能,可以自已封装SQL函数

    Queryable

    Select用法 一列、多列、匿名对象、多表映射等
    Where用法 表达式、拼表达式、Sql、动态条件 等
    生命周期 原理、引用类型、拷贝机制
    执行查询

     ToList  First  ToDateTable ToJson ToTree ToParentList ToSql  ToPivotList ToPivotTable

     ToClassString  ToDictionary   ToDictionaryList   Count   Any  Sum

     Max Min

    报表

    报表查询

    让ORM可以方便的实现报表统计

    Sql查询

    Sql语句查询和分页

     

    ORM实现报表 

    用ORM实现报表有2个短板

    1. Sql可以方便的 创建临时表并且可以将这些临时表进行 JOIN 操作

    2.Sql可以方便的实现行列互转操作

    实践一、 按月统计没有记录为0

    表结构如下

    我们用Gropby实现查询,发现结果就只有3条记录,其中2月份就没有数据,那么这个Sql就不符合要求

    这个时候我们就需要生成一个月份临时表

    然后上面的表在和临时表 进行JOIN 在分组,会不会认为Sql也挺麻烦的呢?

    用SqlSugar轻松实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var queryableLeft = db.Reportable(ReportableDateType.MonthsInLast1years).ToQueryable<DateTime>(); //生成月份
    //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤
    var queryableRight = db.Queryable<operateinfo>(); //声名表
     
    //月份和表JOIN
    var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.operate_time.ToString("yyyy-MM")== x1.ColumnName .ToString("yyyy-MM"))
    .GroupBy((x1,x2)=>x1.ColumnName)
    .Select((x1, x2) => new {
                         count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) , //null的数据要为0所以不能用count
                         date=x1.ColumnName.ToString("yyyy-MM") }
    ).ToList();  

    实践二、 指定月统计

     还是这张表和数据,下面数据只有2条还是不符合要求,应该是31条记录

    用SqlSugar实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var days = (time.AddMonths(1) - time).Days;//获取1月天数
    var dayArray = Enumerable.Range(1, days).Select(it=> time.ToString("yyyy-MM-"+it)).ToList();//转成时间数组
    var queryableLeft = db.Reportable(dayArray).ToQueryable<DateTime>();
    var queryableRight = db.Queryable<operateinfo>();
    var list = db.Queryable(queryableLeft, queryableRight, JoinType.Left,
        (x1, x2) => x1.ColumnName.Date==x2.operate_time.Date)
        .GroupBy((x1, x2) => x1.ColumnName)
        .Select((x1, x2) => new
        {
            count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.id > 0, 1, 0)),
            day = x1.ColumnName.Day
     
        }).ToList();

       

    结果出来了,我们还能做的更好点在进行一下行转列

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var days = (time.AddMonths(1) - time).Days;//获取1月天数
    var dayArray = Enumerable.Range(1, days).Select(it=> time.ToString("yyyy-MM-"+it)).ToList();//转成时间数组
    var queryableLeft = db.Reportable(dayArray).ToQueryable<DateTime>();
    var queryableRight = db.Queryable<operateinfo>();
    var list = db.Queryable(queryableLeft, queryableRight, JoinType.Left,
        (x1, x2) => x1.ColumnName.Date==x2.operate_time.Date)
        .GroupBy((x1, x2) => x1.ColumnName)
        .Select((x1, x2) => new
        {
            count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.id > 0, 1, 0)),
            day = x1.ColumnName.Day,
            name="合计"
     
        }).ToPivotTable(it => it.day, it => it.name, it => it.Sum(x => x.count));

     

    实践三、对象和表随意JOIN

    比如我们创建一个List对象,我们这个List对象就能和表进行Join了

    1
    2
    3
    4
    5
    6
    7
    8
    var list = new List<OrderItem>() {
          new OrderItem(){ CreateTime=DateTime.Now, OrderId=1, Price=100 },
          new OrderItem(){ CreateTime=DateTime.Now, OrderId=2, Price=120 }
        };
        var query1 = db.Queryable<Order>();
        var queryable2 = db.Reportable(list).ToQueryable();
        var x = db.Queryable(query1, queryable2, (x1, x2) => x1.Id.Equals(x2.OrderId))
            .Select((x1, x2) => new { name = x1.Name,id=x1.Id, orderid = x2.OrderId }).ToList();

      

    源码下载:

    https://github.com/donet5/SqlSugar   记得点赞和推荐 SqlSugar将会一直更新,你的赞和推荐就是我最好的动力

  • 相关阅读:
    光棍节的小窃喜
    叶子的飘逝,是谁的错
    IDEA日志文件使用EmEditor打开————解决打开大txt文件崩溃的问题
    java并发编程系列(一):java多线程中常用指令
    HashMap理解
    RabbitMQ入门
    Docker学习笔记
    elementui级联选择器(elcascader)改变value与label
    tinymce富文本不刷新二次打开无法编辑问题
    融合通信常见问题2月刊 | 云信小课堂
  • 原文地址:https://www.cnblogs.com/wl-blog/p/15003092.html
Copyright © 2020-2023  润新知