用 .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轻松实现
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将会一直更新,你的赞和推荐就是我最好的动力
推荐阅读
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.2 在框架的基础上利用SqlSugar快速实现CRUD实战篇
-
用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET
-
用php 怎么来实现asp.net中的Global.asax页面的功能
-
【从零开始搭建自己的.NET Core Api框架】(三)集成轻量级ORM——SqlSugar:3.2 在框架的基础上利用SqlSugar快速实现CRUD实战篇
-
用php 怎么来实现asp.net中的Global.asax页面的功能
-
用php 怎么来实现asp.net中的Global.asax页面的功能
-
用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET