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

发布时间:2026/10/24 12:45:53
【报表查询】.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 listqueryableLeft .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(itDateTime.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(itConvert.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(itDateTime.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 list2db.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 insertDatadts.Select(it new SingleColumnEntity() { ColumnName it }).ToList(); db.FastestSingleColumnEntity().AS(tableName).BulkCopy(insertData); //查询统计 var list db.QueryableSingleColumnEntity() .AS(tableName) .LeftJoin((it, o) o.CreateTime.Dateit.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 list111db.Reportable(dts).ToQueryable() .LeftJoin((it, o) o.CreateTime it.ColumnName o.CreateTime it.ColumnName.AddMinutes(10)) .GroupBy(it it.ColumnName) .Select((it,o) new { itit.ColumnName, countSqlFunc.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 { idx.Id, timey.ColumnName }) .MergeTable() //leftjoin .OrderBy(itit.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 系列

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询