【报表查询】.NET开源ORM框架 SqlSugar 系列

【报表查询】.NET开源ORM框架 SqlSugar 系列

文章目录


前言

在我们实际开发场景中,报表是最常见的功能,业主爸爸们最喜欢对着大屏和报表指点江山。

今天介绍如果通过 sqlsugar 层来处理报表数据。

  1. Sql 可以方便的创建 临时表 并且可以将这些 临时表 进行 JOIN 操作。
  2. Sql 可以方便的实现 行列互转 操作。

以上2点用 sqlsugar 就能很好解决,下面我们将来展示几个最常见的实践示例。

先准备一张表,表结构如下:

在这里插入图片描述

实践一、按月统计没有为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>();//声名表//月份和表JOINvar list=queryableLeft .LeftJoin(queryableRight,(x1,x2)=>x2.operate_time.ToString("yyyy-MM")==x1.ColumnName.ToString("yyyy-MM")).GroupBy((x1,x2)=>x1.ColumnName).Select((x1, x2)=>new{//null的数据要为0所以不能用count count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.id >0,1,0)), date = x1.ColumnName.ToString("yyyy-MM")}).ToList();//技巧 : 近50天//var day30= Enumerable.Range(0,50).Select(it=>DateTime.Now.Date.AddDays(it*-1)).ToList()//var queryableLeft = db.Reportable(day30).ToQueryable<DateTime>();
在这里插入图片描述

实践二、 统计某月每天的数量

Sql 进行分组查询:

在这里插入图片描述


结果只查询出1号和2号的数据,不符合要求。

💯SqlSugar 轻松实现:

//如果是查询当月那么 time就是 DateTime.Nowvar days =(time.AddMonths(1)- time).Days;//获取1月天数var dayArray = Enumerable.Range(1, days).Select(it=>Convert.ToDateTime(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();//技巧 : 近50天//var day30= Enumerable.Range(0,50).Select(it=>DateTime.Now.Date.AddDays(it*-1)).ToList()//var queryableLeft = db.Reportable(day30).ToQueryable<DateTime>();
在这里插入图片描述

如果表格需要行转列,代码如下:

//如果是查询当月那么 time就是 DateTime.Nowvar days =(time.AddMonths(1)- time).Days;//获取1月天数var dayArray = Enumerable.Range(1, days).Select(it=> Convert.ToDateTime(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));//在统计时存在空引用要改成这样//.ToPivotTable(it => it.day, it => it.name, it=> it.Any() ? it.Sum(y => y.Count):0 );
在这里插入图片描述

实践三、对象和表随意JOIN

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

var queryable2 = db.Reportable(List<实体>).ToQueryable();var list= db.Queryable<Order>().InnerJoin(queryable2,(x1, x2)=> x1.Id == x2.OrderId).Select((x1, x2)=>new{ name = x1.Name, id = x1.Id, orderid = x2.OrderId }).ToList();

实践四、 List和表随意JOIN

//Order join list<int>var ids =newList<int>(){1,2,3};var queryable2 = db.Reportable(ids).ToQueryable<int>();var list = db.Queryable<Order>().InnerJoin(queryable2,(x, y)=> x.Id == y.ColumnName).ToList();//list<int> join Order var ids =newList<int>(){1,2,3};var list2=db.Reportable(ids).ToQueryable<int>().InnerJoin<Order>((y, x)=> y.ColumnName == x.Id).ToList();

实践五、大数据处理

按天统计 Count,左边的表时间多了我们可以用临时表进行性能优化。

List<DateTime> dts =newList<DateTime>(){};for(int i =0; i <1000; i++)//搞出所有时间断{ dts.Add(DateTime.Now.Date.AddDays(-i));}//创建临时表 (用真表兼容性好,表名随机)var tableName ="Temp"+ SnowFlakeSingle.Instance.NextId();var type = db.DynamicBuilder().CreateClass(tableName,newSugarTable()).CreateProperty("ColumnName",typeof(DateTime),newSugarColumn(){ IsPrimaryKey =true})//主键不要自增 .BuilderType(); db.CodeFirst.InitTables(type);//创建表//将时间集合插入临时表var insertData=dts.Select(it =>newSingleColumnEntity<DateTime>(){ ColumnName = it }).ToList(); db.Fastest<SingleColumnEntity<DateTime>>().AS(tableName).BulkCopy(insertData);//查询统计var list= db.Queryable<SingleColumnEntity<DateTime>>().AS(tableName).LeftJoin<Order>((it, o)=> o.CreateTime.Date==it.ColumnName.Date).GroupBy(it => it.ColumnName).Select((it, o)=>new{ it = it.ColumnName, count = SqlFunc.AggregateCount(o.Id)}).ToList();//删除临时表 db.DbMaintenance.DropTable(tableName);

实践六、每10分钟统计Count

List<DateTime> dts =newList<DateTime>(){ DateTime.Now.Date.AddDays(1)};for(int i =0; i <100000; i++)//搞出所有时间断{ dts.Add(dts.Last().AddMinutes(-10));} dts = dts .Where(it => it >= Convert.ToDateTime("2023-1-1")).Where(it => it <= Convert.ToDateTime("2023-4-7"))//过滤出你要的时间.ToList();var list111=db.Reportable(dts).ToQueryable<DateTime>().LeftJoin<Order>((it, o)=> o.CreateTime >= it.ColumnName && o.CreateTime <= it.ColumnName.AddMinutes(10)).GroupBy(it => it.ColumnName).Select((it,o)=>new{ it=it.ColumnName, count=SqlFunc.AggregateCount(o.Id)}).ToList();
在这里插入图片描述

实践七、 每个ID都要对应时间

List<DateTime> dts =newList<DateTime>(){ 七月2号 ,七月3号 };var IdQ= db.Queryable<Order>().Select(it =>newOrder(){ Id = it.Id }).Distinct();var dateQ= db.Reportable(dts).ToQueryable<DateTime>();var newlist= IdQ.InnerJoin(dateQ,(x, y)=>true).Select((x,y)=>new{ id=x.Id, time=y.ColumnName }).MergeTable()//leftjoin .OrderBy(it=>it.time).ToList();
在这里插入图片描述

总结

以前用原生 SQL 写报表查询真的太费劲了,现在有了 ORM 的加持,感觉不要太好。好了,今天就到这吧,给我点点赞,拉拉关注。


🎀💎🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀💎🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列

在这里插入图片描述

Read more

Flutter 三方库 json_object_mapper 的鸿蒙化适配指南 - 实现 JSON 到业务对象的极致自动化映射、助力鸿蒙端数据层代码瘦身

Flutter 三方库 json_object_mapper 的鸿蒙化适配指南 - 实现 JSON 到业务对象的极致自动化映射、助力鸿蒙端数据层代码瘦身

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 json_object_mapper 的鸿蒙化适配指南 - 实现 JSON 到业务对象的极致自动化映射、助力鸿蒙端数据层代码瘦身 前言 在 OpenHarmony 鸿蒙应用的数据驱动架构中,JSON 的解析与序列化几乎是每一位开发者的“家常便饭”。传统的 jsonDecode + 手动字段提取方案,不仅效率低下,且在面对层级极其复杂的业务报表时,极易因拼写错误导致运行时 Null Check 异常。虽然行业内有 json_serializable 等方案,但对于追求极致开发体验、希望像 Java Gson 或 Swift HandyJSON 那样通过简单配置即可完成映射的开发者来说,json_object_mapper 提供了一套更具声明感的方案。本文将带你探索如何将 json_

Flutter 三方库 galileo_mysql 的鸿蒙化适配指南 - 支持 MySQL 8.0 协议、高性能长连接与异步事务处理

Flutter 三方库 galileo_mysql 的鸿蒙化适配指南 - 支持 MySQL 8.0 协议、高性能长连接与异步事务处理

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 galileo_mysql 的鸿蒙化适配指南 - 支持 MySQL 8.0 协议、高性能长连接与异步事务处理 前言 在 Flutter for OpenHarmony 的应用开发中,直接在端侧进行数据库操作虽然不是主流(通常通过 API),但在某些边缘计算或内网工具类场景下,直接连接 MySQL 数据库依然是刚需。galileo_mysql 作为一个纯 Dart 实现的 MySQL 驱动,其天然的跨平台属性使其成为鸿蒙端直接操作 MySQL 的首选。本文将详细介绍如何在 OpenHarmony 环境下适配并使用该库。 一、原理解析 / 概念介绍 1.1 基础原理 galileo_

【Linux】IP

【Linux】IP

📝前言: 这篇文章我们来讲讲Linux网络——IP 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀ZEEKLOG主页 愚润求学 🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏 目录 * 一,IP协议格式 * 二,网段划分 * 三,特殊IP地址 * 四,私有IP和公网IP * 五,路由 一,IP协议格式 * IP 位于五层结构中的网络层 * 主机: 配有 IP 地址, 但是不进行路由控制的设备; * 路由器: 即配有 IP 地址, 又能进行路由控制; 第一行: * 版本: IPv4 或 IPv6 * 4位首部长度:4字节为单位,表示IP报头长度 * TOS:

Flutter 三方库 iirjdart 的鸿蒙化适配指南 - 深度解析 IIR 数字滤波器、处理鸿蒙端传感器信号噪声及高精度信号调优实战

Flutter 三方库 iirjdart 的鸿蒙化适配指南 - 深度解析 IIR 数字滤波器、处理鸿蒙端传感器信号噪声及高精度信号调优实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 iirjdart 的鸿蒙化适配指南 - 深度解析 IIR 数字滤波器、处理鸿蒙端传感器信号噪声及高精度信号调优实战 前言 在涉及硬件交互、传感器数据监控以及音频处理的鸿蒙(OpenHarmony)应用中,数据往往不是“完美”的。当我们通过鸿蒙系统的陀螺仪测量倾角,或者通过加速度计探测手势时,采集到的原始信号往往充斥着高频由于硬件抖动产生的毛刺和低频的漂移噪声。 如何过滤这些干扰,提取出平滑且真实的有效数据? iirjdart 提供了一套在 Dart 层面上实现的工业级 IIR(无限脉冲响应)数字滤波器库。它涵盖了巴特沃斯(Butterworth)、切比雪夫(Chebyshev)以及贝塞尔(Bessel)等多种经典的滤波算法。 适配到鸿蒙系统后,我们需要关注的不仅仅是算法的准确性,更是其在高频传感器回调中是否会导致主线程阻塞,以及在不同比特深度的音频流处理中的数值稳定性。本文将为你详解 iirjdart 的鸿蒙实战调优方案。 一

阿里云全品类 8 折券限时领,建站 / AI / 存储通用 立即领取