【报表查询】.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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践一、按月统计没有为0](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践二、 统计某月每天的数量](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践三、对象和表随意JOIN](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践四、 List和表随意JOIN](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践五、大数据处理](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践六、每10分钟统计Count](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [实践七、 每个ID都要对应时间](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* [总结](#文章目录* 前言* 实践一、按月统计没有为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().AS(tableName).BulkCopy(insertData); //查询统计 var list= db.Queryable() .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 系列)* * 前言--在我们实际开发场景中,报表是最常见的功能,业主爸爸们最喜欢对着大屏和报表指点江山。今天介绍如果通过 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 系列
相关推荐
写的都是BUG1 小时前
我开源了一个 Android/iOS 加固工具,顺便聊聊加固到底能防住什么
开源·掘金社区
caoerzhong1 小时前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
SL_staff3 小时前
目标健康度自检清单:开发者视角下的目标-计划-任务链路断点诊断
java·开源·github
独孤九剑打醒他5 小时前
【原创开源·修订版】源-栅-漏-栅-源横向双栅MOS:从“被误解的短路”到“电流路径多值逻辑与顶层供电架构”
前端·嵌入式硬件·架构·开源·硬件工程
阿俊-全栈开发6 小时前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城
波力海苔夹心脆6757 小时前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
来自于狂人7 小时前
GitHub 开源趋势日报 | 2026年10月9日
开源·github
wflynn7 小时前
GitHub 今日推荐|wordcraft:用 Rust 重写 Word 内核并开放给 AI 调用
rust·开源·github
I'm Jie7 小时前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
开发语言·rust·开源
tianbin9118 小时前
2026大模型API选型指南:从训练到推理,如何构建高效稳定的模型调用链路?
开源