【报表查询】.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

Git 多人协作全流程实战:分支协同 + 冲突解决 + 跨分支协助

Git 多人协作全流程实战:分支协同 + 冲突解决 + 跨分支协助

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 多人协作模式一:同一分支协同开发(简单场景) * 二. 协作模式二:多分支并行开发(推荐场景) * 三. 远程分支删除后,本地 git branch -a 依然能看到的解决办法 * 结尾: 前言: 单人开发时,Git 的本地分支管理已能满足版本控制需求,但进入团队协作后,核心痛点变成了 “如何有序同步代码、避免冲突、高效协作”。Git 的分布式特性让多人开发灵活高效,但缺乏规范流程会导致代码混乱、冲突频发。本文结合 多人协作的两大核心场景(同一分支协同、多分支并行开发),拆解从分支创建、代码同步到冲突解决的完整流程,附具体命令和实操案例,帮你快速掌握企业级

By Ne0inhk
GitHub Spec Kit 中文使用说明

GitHub Spec Kit 中文使用说明

📖 工具简介 GitHub Spec Kit 是GitHub开源的规范驱动开发(Specification-Driven Development, SDD)工具包,它彻底颠覆了传统软件开发模式。在传统开发中,代码是王者,规范服务于代码;而Spec Kit实现了权力反转——规范成为主导,代码服务于规范。规范不再是指导实现的文档,而是能够直接生成实现的可执行文件。 该项目在过去30天内星标数量约20k,近期平均每天新增超1k星标,这反映出其高速增长趋势和社区的积极反馈。这种受欢迎度源于其易用性和强大的功能,帮助开发者高效处理标准化工作流。 🎯 核心理念:权力反转 传统模式:规范 → 指导 → 代码实现 SDD模式:规范 → 直接生成 → 代码实现 * 规范优先:规范成为开发的首要驱动力,而非辅助文档 * 可执行规范:规范足够精确和完整,能够直接生成工作系统 * 消除鸿沟:彻底消除规范与实现之间的转译差距 * AI协同增强:通过AI的理解能力让自然语言规范变为可执行代码 * 持续进化:生产反馈直接更新规范,驱动下一轮生成 🚀 安装方法 1. 环境要求

By Ne0inhk

从零开始:用Jekyll和Github Pages构建高效静态博客

1. 为什么选择Jekyll+Github Pages搭建博客? 十年前我第一次接触个人博客时,用的还是WordPress。当时不仅要买服务器、配置数据库,还要时刻担心被黑客攻击。直到发现了Jekyll+Github Pages这个组合,才真正体会到什么叫"优雅建站"。 静态博客相比传统动态博客有三个明显优势:首先是速度飞快,因为所有页面都是预生成的HTML文件,访问时不需要数据库查询;其次是绝对安全,没有PHP和数据库就意味着没有注入漏洞;最重要的是完全免费,Github Pages提供无限流量托管,还能绑定自定义域名。 我自己的技术博客已经用这个方案运行了5年,日均访问量2000+从未宕机。最让我惊喜的是,用Markdown写完文章后,只需要git push一下,几分钟后就能自动发布到线上——这种流畅的写作体验,是其他建站方式难以比拟的。 2. 环境准备与基础配置 2.1 安装Ruby环境 Jekyll基于Ruby开发,所以需要先配置Ruby环境。以MacOS为例(Windows用户建议使用WSL): # 使用Homebrew安装 brew install ruby

By Ne0inhk
使用开源三件套OpenClaw+Ollama+1Panel部署7×24运行

使用开源三件套OpenClaw+Ollama+1Panel部署7×24运行

一、写在前面 本次操作教程将以开源 Linux 服务器运维面板 1Panel 为基础,搭配 Ollama 本地大模型(无需担心 Token 消耗费用),手把手教你部署 OpenClaw 个人 AI 助理,实现 7×24 小时稳定运行,轻松拥有专属智能助手! 二、资源准备 本次 OpenCalw 本地个人 AI 助理基于一台腾讯 GPU 云服务器构建,云服务器获取过程不做赘述,参见腾讯云官网。其中服务器的配置参见如下: * 操作系统:Ubuntu Server 24.04 LTS 64 位 * 计算资源:20 核 80 G * 磁盘容量:100G

By Ne0inhk