news 2026/8/31 4:05:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【报表查询】.NET开源ORM框架 SqlSugar 系列
文章目录*前言* 实践一、按月统计没有为0* 实践二、 统计某月每天的数量* 实践三、对象和表随意JOIN* 实践四、 List和表随意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(); //生成月份 //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 var queryableRight = db.Queryable(); //声名表 //月份和表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所以不能用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();实践二、 统计某月每天的数量--------------用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(); var queryableRight = db.Queryable(); var list = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x1.ColumnName.Datex2.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();如果表格需要行转列,代码如下: //如果是查询当月那么 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(); var queryableRight = db.Queryable(); var list = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x1.ColumnName.Datex2.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().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 var ids = new List() { 1, 2, 3 }; var queryable2 = db.Reportable(ids).ToQueryable(); var list = db.Queryable().InnerJoin(queryable2, (x, y) => x.Id == y.ColumnName).ToList(); //list join Order var ids = new List() { 1, 2, 3 }; var list2=db.Reportable(ids).ToQueryable().InnerJoin((y, x) => y.ColumnName == x.Id).ToList(); 实践五、大数据处理---------按天统计Count,左边的表时间多了我们可以用临时表进行性能优化。 List dts = new List() { }; 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() { ColumnName = it }).ToList(); db.Fastest<SingleColumnEntity>().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable<SingleColumnEntity>() .AS(tableName) .LeftJoin((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 dts = new List() { 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() .LeftJoin((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 dts = new List() { 七月2号 ,七月3号 }; var IdQ= db.Queryable().Select(it => new Order() { Id = it.Id }).Distinct(); var dateQ= db.Reportable(dts).ToQueryable(); 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 系列
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 4:00:25

开源AI助手接口模块开发:从双通道并发到故障隔离的工程实践

开源AI助手项目做到一定阶段&#xff0c;基本都会遇到同一个问题&#xff1a;不能只靠本地代码把功能堆完&#xff0c;还得把第三方接口模块接进来&#xff0c;让助手能调外部能力。枫云AI这类的开源助手&#xff0c;在能力扩展时通常会做一层“接口模块”来解耦。这里以“双龙…

作者头像 李华
网站建设 2026/8/31 3:59:52

USB设备接入与SYSTEM权限提升:Windows安全加固防御指南

最近 Windows 安全圈有一类资讯讨论度很高&#xff1a;系统在不经意间可能因为 USB 设备接入而产生权限提升风险&#xff0c;背景是 SYSTEM 权限和“管理员密码”的关系被很多人误读。作为系统管理员&#xff0c;我看到这类标题的第一反应不是去复现攻击链&#xff0c;而是先确…

作者头像 李华
网站建设 2026/8/31 3:59:06

基于YOLOv8的NWPU VHR-10与DOTA小目标检测实践

简介&#xff1a;本资源是一套基于YOLOv8实现的小目标检测完整开源方案&#xff0c;面向计算机视觉方向的研究者、算法工程师及深度学习进阶学习者&#xff0c;聚焦遥感图像中飞机、车辆等小尺度目标的精准识别难题。项目已在NWPU VHR-10与DOTA两大主流遥感数据集上完成训练、验…

作者头像 李华
网站建设 2026/8/31 3:57:44

Pandas 2小时速通:数据清洗与分组聚合实战指南

如果你正在准备数据分析面试、要处理表格类数据&#xff0c;或者想把 Excel 里那套手工操作换成脚本化处理&#xff0c;Pandas 基本是绕不开的第一站。这篇教程按“2 小时速通”的节奏设计&#xff0c;从环境安装到数据清洗、分组聚合、合并关联、格式落地&#xff0c;再到可视…

作者头像 李华