暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

DotNet开发跳槽 2021-07-22
1745

架框介绍

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.Su
m(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.Ord
erId }
).ToList();

  

源码下载:

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

出处:

https://www.cnblogs.com/sunkaixuan/archive/2021/07/05/14974056.html

支持小微:

腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。

云服务器限时秒杀,1核2G 首年95元!

链接:https://curl.qcloud.com/RX2amrlR


右下角,您点一下在看图片

小微工资涨1毛

商务合作QQ:185601686



文章转载自DotNet开发跳槽,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论