当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 实践一、按月统计没有为0
  • 实践二、 统计某月每天的数量
  • 实践三、对象和表随意JOIN
  • 实践四、 List<int>和表随意JOIN
  • 实践五、大数据处理
  • 实践六、每10分钟统计Count
  • 实践七、 每个ID都要对应时间
  • 总结


前言

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

今天介绍如果通过 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>(); //声名表//月份和表JOIN
var 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所以不能用countcount = 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.Now
var 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.Now
var 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 = new List<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 = new List<int>() { 1, 2, 3 };var list2=db.Reportable(ids).ToQueryable<int>().InnerJoin<Order>((y, x) => y.ColumnName == x.Id).ToList();

实践五、大数据处理

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

   
List<DateTime> dts = new List<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, new SugarTable()).CreateProperty("ColumnName", typeof(DateTime), new SugarColumn() { IsPrimaryKey = true })//主键不要自增 .BuilderType();db.CodeFirst.InitTables(type);//创建表//将时间集合插入临时表
var insertData=dts.Select(it => new SingleColumnEntity<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 = new List<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 = new List<DateTime>() { 七月2,七月3}; var IdQ= db.Queryable<Order>().Select(it => new Order(){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 系列

在这里插入图片描述

相关文章:

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

文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中&#xff0c;报表是最常见的功能&a…...

PostgreSQL数据库访问限制详解

pg_hba.conf 文件是 PostgreSQL 数据库系统中非常重要的一个配置文件&#xff0c;它用于定义哪些用户&#xff08;或客户端&#xff09;可以连接到 PostgreSQL 数据库服务器&#xff0c;以及他们可以使用哪些认证方法进行连接。 pg_hba.conf 的名称来源于 "Host-Based Aut…...

【test linux】创建一个ext4类型的文件系统

创建一个ext4类型的文件系统 dd 是一个非常强大的命令行工具&#xff0c;用于在Unix/Linux系统中进行低级别的数据复制和转换。这条命令的具体参数含义如下&#xff1a; if/dev/zero&#xff1a;指定输入文件&#xff08;input file&#xff09;为 /dev/zero&#xff0c;这是一…...

如何在繁忙的生活中找到自己的节奏?

目录 一、理解生活节奏的重要性 二、分析当前生活节奏 1. 时间分配 2. 心理状态 3. 身体状况 4. 生活习惯 1. 快慢适中 2. 张弛结合 3. 与目标相符 三、掌握调整生活节奏的策略 1. 设定优先级 2. 合理规划时间 3. 学会拒绝与取舍 4. 保持健康的生活方式 5. 留出…...

AI-PR曲线

PR曲线 人工智能里面的一个小概念。 2.3 性能度量&#xff08;查全率&#xff0c;查准率&#xff0c;F1&#xff0c;PR曲线与ROC曲线&#xff09; 预测出来的是一个概率&#xff0c;不能根据概率来说它是正类还是负类&#xff0c;要有一个阈值。 查准率&#xff08;Precision&…...

Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类

入门示例 guava 最佳实践 学习指南 以下是使用Google Guava库中的工具方法来创建和操作List、Set、Map集合的一些示例&#xff1a; List相关操作 创建List 使用Lists.newArrayList()创建一个新的可变ArrayList实例。List<Integer> list Lists.newArrayList(1, 2, 3);/…...

深入解析 Elasticsearch 集群配置文件参数

在自建 Elasticsearch 集群时&#xff0c;我们需要通过 elasticsearch.yml 文件对节点角色、网络设置、集群发现和数据存储路径等进行灵活配置。配置项的合理设置对集群的稳定性、性能与扩展性影响深远。本文将以一个示例配置文件为蓝本&#xff0c;逐条解析各参数的含义与建议…...

WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)

一:基本介绍 WebMvcConfigurer是接口&#xff0c;用于配置全局的SpringMVC的相关属性&#xff0c;采用JAVABean的方式来代替传统的XML配置文件&#xff0c;提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurationSupport是webmvc的…...

用 javascript 来回答宇宙外面是什么

宇宙外面是什么呢? 估计这个问题要困扰很多人, 让我们用一段 javascript 代码来回答一下. 一, 从一段代码说起 var 地球 {名字 : "地球",女友 : "月亮",外面 : {名字 : "太阳系",老大 : "太阳",老二 : {名字 : "木星",二…...

我的性能优化经验

专业方向&#xff1a;App cpu/memory/gpu/流畅度/响应时间的优化&#xff0c;Anr&#xff0c;Framework CarPowerManagementService模块的&#xff08;STR&#xff09;&#xff0c;从0~1完成性能监控体系搭建&#xff0c;完成3大版本迭代高质量性能交付 响应时间&#xff1a; …...

XSLT 编辑 XML

XSLT 编辑 XML 介绍 XSLT&#xff08;可扩展样式表语言转换&#xff09;是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式&#xff0c;如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素&#xff0c;并对这些元素应用转换规则。在本教程…...

数智读书笔记系列010 生命3.0:人工智能时代 人类的进化与重生

书名&#xff1a;生命3.0 生命3.0&#xff1a;人工智能时代,人类的进化与重生 著者&#xff1a;&#xff3b;美&#xff3d;迈克斯•泰格马克 迈克斯・泰格马克 教育背景与职业 教育背景&#xff1a;迈克斯・泰格马克毕业于麻省理工学院&#xff0c;获物理学博士学位。职业经…...

Transfomer的各层矩阵

一、输入 输入一句话&#xff1a;Hello CYZLAB the inspired world 每个单词为一个token 二、Embedding 这里的词向量维度为6&#xff0c;矩阵的行数为token数&#xff0c;列数是词向量的维度 这列是注释不算hello122694CYZLAB222372the222596inspired132440world431273 …...

代码随想录第51天

99.岛屿数量 深搜 import java.util.*;class Main{static int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};static boolean[][] visited;public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int…...

基础库httpx的使用

urllib 库和 requests 库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问&#xff0c;这时 urllib 和requests 是无法爬取数据的&#xff0c;因为它们只支持 HTTP/1.1&#xff0c;不支持…...

c++中如何保持结构体的线程安全?3D坐标的线程安全:从理论到最优解

使用mutex的困扰 struct Point3d {std::mutex mtx;double x, y, z;void set(double nx, double ny, double nz) {std::lock_guard<std::mutex> lock(mtx);x nx; y ny; z nz;} };这种方案虽然安全&#xff0c;但性能开销确实不小。每次访问都需要加锁解锁&#xff0c;…...

Zabbix6.0升级为6.4

为了体验一些新的功能&#xff0c;比如 Webhook 和问题抑制等&#xff0c;升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档&#xff0c;确认组件要求的版本&#xff0c;否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…...

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署 二.测试环境 系统环境&#xff1a;CentOS、 运行环境&#x…...

【Lua热更新】下篇 -- 更新中

上篇链接&#xff1a;【Lua热更新】上篇 文章目录 三、xLua热更新&#x1f4d6;1.概述&#x1f4da;︎2.导入xLua框架&#x1f516;3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…...

射频测试入门学习(三)——程控仪器是怎样和电脑连接通信的

目录 一、程控仪器需要哪些条件 二、可程控仪器 三、专业的仪器通信软件、驱动 四、编程语言 五、电脑控制仪器条件汇总 六、仪器指令查询 七、结语 一、程控仪器需要哪些条件 1、需要具备硬件条件(可程控的仪器、个人计算机(PC)) 2、专业的仪器通信软件、驱动 3、…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...