用 .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函数 |
|
|
|
| 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;//获取2021年1月的总天数
var dayArray = Enumerable.Range(1, days).ToList();//转成int数组
var queryableLeft = db.Reportable(dayArray).ToQueryable<int>();
var queryableRight = db.Queryable<operateinfo>();
var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x2.operate_time.Day==x1.ColumnName)
.GroupBy((x1,x2)=>x1.ColumnName)
.Select((x1, x2) => new
{
count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) ,
day=x1.ColumnName }).ToList();
结果出来了,我们还能做的更好点在进行一下行转列
var days = (time.AddMonths(1) - time).Days;//获取1月天数
var dayArray = Enumerable.Range(1, days).ToList();//转成int数组
var queryableLeft = db.Reportable(dayArray).ToQueryable<int>();
var queryableRight = db.Queryable<operateinfo>();
var list= db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x2.operate_time.Day==x1.ColumnName)
.GroupBy((x1,x2)=>x1.ColumnName)
.Select((x1, x2) => new
{
count=SqlFunc.AggregateSum(SqlFunc.IIF(x2.id>0,1,0)) ,
day=x1.ColumnName }).ToPivotTable( it=>it.day,it=> it.count, 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将会一直更新,你的赞和推荐就是我最好的动力
用 .SqlSugar ORM 来实现报表功能 .NET CORE /.NET的更多相关文章
- 高性能数据导入方案&表过滤器&一对多支持筛选- .NET SqlSugar ORM
一.数据导入有哪些难题 1.数据分类 你需要将 插入.更新.忽略不计.错误数据 等进么分类汇总,最后返回给客户,如果没有很好的设计想把这些操作一步到位非常的难 2.高性能 对于插入或者更新 肯定不能单 ...
- SqlSugar ORM已经支持读写分离
目前只有MYSQL版 3.5.2.9 支持,其库版本12月3号更新该功能 用例讲解 using (var db = new SqlSugarClient("主连接字符串", &qu ...
- SqlSugar ORM 入门到精通【一】入门篇
背景 SqlSugar是一款国产ORM,除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手. 2.x版本正式在自已公司内部项目使用 3.x版本得到了更多公司的喜欢不过也会 ...
- Myeclipse2014 自带的报表功能 与 Eclipse BIRT
Myeclipse2014 自带的报表功能跟 Eclipse BIRT 差不多,但不兼容 1.只能是MyEclipse Web projects 或者 Report Web project不支持B ...
- 记SqlSugar ORM框架之找不到主键问题
前端时间在.NetCore项目中使用SqlSugar ORM框架(引用sqlSugarCore依赖包)的时候遇到了一个奇葩问题:对表进行数据更新操作的时候,报错 “ You cannot have n ...
- .Net Core 3.0 MVC 中使用 SqlSugar ORM框架
介绍 SqlSugar 是一款简单易用的ORM ,在国内市场占有率也比较高, 在今年10月份官网改版后 提供了完整的服务,让您的项目没有后顾之忧 下载地址 :https://github.com/s ...
- 比较爽的导航查询 功能 - SqlSugar ORM
1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...
- Asp.Net 高性能ORM框架 SqlSugar.ORM 2.8
3.0最新API: http://www.cnblogs.com/sunkaixuan/p/5911334.html 1.前言/Preface SqlSugar从去年到现在已经一年了,版本从1.0升到 ...
- ASP.NET - SqlSugar ORM框架 更新列表
以后SqlSugar所有更新都会在这个贴子更新 SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSug ...
随机推荐
- 通过format学习,python的内部方法是面象对象的-python面向对象
1.常用的形式 s ="{0} {0} qqq {0} xxx {1}".format('dog','cat')print(s) 结果:dog dog qqq dog xxx ca ...
- Ubuntu 20.04 配置多网卡链路聚合
Ubuntu 20.04 配置多网卡链路聚合 多网卡IP配置 首先查看网卡信息 root@it:~# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65 ...
- shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...
- F5 BIG-IQ 8.0 发布 - 借助一个统一的管理平台,管理您的所有 BIG-IP 设备和服务
针对完整可见性和控制的 BIG-IQ 集中式管理 BIG-IP 设备和服务的端到端控制 高效管理(编排.可见性和合规性)依赖于跨本地和云部署中始终如一的应用服务和安全策略.利用独立统一的管理平台实现对 ...
- WPF中Grid容器中VerticalAlignment和HorizonAlignment和Margin的关系。
在WPF中,经常使用Grid容器,来布局我们想要显示的对象. 这就不可避免的要和布局在其中的控件的VerticalAlignment特性,HorizonAlignment特性,以及Magin特性打交道 ...
- 记一次zabbix-server故障恢复导致的事故 zabbix-server.log -- One child process died
前言 zabbix-server昨天出了个问题,不停的重启.昨天摆弄到晚上也不搞清楚原因,按照网上说的各种操作,各种CacheSize.TimeOut.StartPollers都改了,还有什么Incl ...
- F5 api接口开发实战手册(二)
F5 rest api 各对象使用方式详解 本篇文章介绍rest api接口下Collection.Resource.Subcollections.SubResource的各种使用方法.如果您不了解这 ...
- 排查利器:Tcpdump抓包 & Wireshark解析
在工作这一块,免不了和其他开发人员打交道.比如,和其他部门 or 公司联调,甚至是和自己部门的人联调的时候.这时候,对接问题就很容易暴露出来,特别是Tcp/Udp会话的时候,很容易就会呈现出公说公有理 ...
- Selenium 库的基本用法
Selenium库的基本使用 1.基本使用 from selenium import webdriver from selenium.webdriver.common.by import By f ...
- Python+Selenium - 定位策略
一个元素定位可能会在多个地方用到,用loc变量接收元素的定位方式和相对路径.使用时再拆包(*loc) loc = (定位方式,'定位方式对应的元素路径') =>元素定位方式及路径 driv ...