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

2021年7月6日 6点热度 0条评论 来源: 果糖大数据科技

架框介绍

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轻松实现

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实现

 

            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();

   

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

            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了

        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将会一直更新,你的赞和推荐就是我最好的动力

    原文作者:果糖大数据科技
    原文地址: https://www.cnblogs.com/sunkaixuan/p/14974056.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。