小白成长记(三、SqlSugar的sum用法)

SqlSugar的GroupBy和Sum用法

hello,大家好。我是闲齁齁,一枚用发量写代码的程序员。今天我做的功能模块里面涉及到了分组和求和这两个功能,于是我就翻阅了SqlSugar的文档来学习分组查询和使用。但是还是写出来了好多问题,接下来我就把问题和解决方法写出来,来帮小伙伴们避个雷。SqlSugar的官方文档我已经在下面打了出来。

http://www.donet5.com/Home/Doc?typeId=2243

首先按我以往的规矩来,先写接口,接口的代码还是和以前一样,不知道怎么写的小伙伴可以详细看一下我的第一篇文章。
写完接口就让我们写服务吧,我会先把我的代码写在下面并告诉大家哪里错了。

                    //异步要加入await
                    var dbResult = await Db.Queryable<实体表1, 实体表2, 实体表3, 实体表4>((f, u, a, b) => new JoinQueryInfos(
                     JoinType.Left, f.1Id == u.Id,
                     JoinType.Left, f.2Id == a.Id,
                     JoinType.Left, f.3Id == b.Id
                     ))                        
                        //.Where((f, u, a, b) => u.IsDelete == false)
                        .GroupBy((f, u, a, b)=> new {f.TypeName,f.TypeEncode,f.UnitId,f.WareHId,f.WareHModelId })
                        .Select((f, u, a, b)=>SqlFunc.AggregateSum(f.RealNumber))
                        .Select((f, u, a, b) => new InventoryMaterialDto
                        {
                            Id = f.Id,
                            ……
                        })
                    //    .MergeTable()//将查询结果转换成一个表在进行sum
                   //     .GroupBy(it => new { it.TypeName, it.TypeEncode, it.unitsName, it.warehouseName, it.warehouseModelName })
                    //    .Filter(null, true)
                    //    .Select(it => new InventoryMaterialDto { 
                    //        RealNumber = SqlFunc.AggregateSum(it.RealNumber),           
                    //        TypeName = it.TypeName, 
                    //        TypeEncode = it.TypeEncode,                          
                    //        unitsName = it.unitsName,
                    //        warehouseName=it.warehouseName,
                    //        warehouseModelName = it.warehouseModelName
                    //        })


                    .ToPageListAsync(model.Page, model.Limit, totalCount);

看到这里不知道有没有细心的小伙伴发现问题,如果没发现的话我来给大家说一下吧。

.GroupBy((f, u, a, b)=> new {f.TypeName,f.TypeEncode,f.UnitId,f.WareHId,f.WareHModelId })
                        .Select((f, u, a, b)=>SqlFunc.AggregateSum(f.RealNumber))                       

我把第一处错误已经沾过来了,那SqlSugar的文档上就是这样写的,哪里会错呢,大家可以看到,我用的还是赋值Dto的写法,但是这里对应的是查的多表,属于语法错误。
那接下来看我们是怎么解决的

     .MergeTable()//将查询结果转换成一个表在进行sum
                        .GroupBy(it => new { it.TypeName, it.TypeEncode, it.unitsName, it.warehouseName, it.warehouseModelName })
                        .Filter(null, true)//关闭过滤
                        .Select(it => new InventoryMaterialDto { 
                            RealNumber = SqlFunc.AggregateSum(it.RealNumber),           
                            TypeName = it.TypeName, 
                            TypeEncode = it.TypeEncode,                          
                            unitsName = it.unitsName,
                            warehouseName=it.warehouseName,
                            warehouseModelName = it.warehouseModelName
                            })

没错,我把这个Dto接管成一个表来进行GroupBy查询,然后根据我们的这个五个条件进行分组查询,然后计算RealNumber这个值的总和。当时的时候在这一步有出现了问题,运行的时候页面上显示IsDelete(字段名)无效,那么导致这个问题的原因就是我们的项目里面有个过滤功能,因为这是个Dto虚拟表,所以数据库没有这个表这个字段。于是我们就关闭掉过滤器。那么到现在是不是大家以为就没什么错误了,那怎么可能,作为专业的写Bug机器,运行的时候页面上居然又显示ExpandoObject对象无效,这一点我属实也没搞明白,不过大家遇到这个错误可以参考一下.net的文档。

https://docs.microsoft.com/zh-cn/dotnet/api/system.dynamic.expandoobject?view=net-5.0

活人还能让尿给憋死嘛,于是我直接删掉重写这一段。

 var dbResult = await Db.Queryable<实体表>()
                    .GroupBy(it => new { it.TypeEncode, it.TypeName, it.UnitId, it.WareHId, it.WareHModelId })
                    .Select(it => new InventoryMaterialDto
                    {
                        RestNumber = SqlFunc.AggregateSum(it.RestNumber),
                        RealNumber=SqlFunc.AggregateSum(it.RealNumber),
                        OutNumber=SqlFunc.AggregateSum(it.OutNumber),
                        LostNumber=SqlFunc.AggregateSum(it.LossNumber),
                        PlanNumber=SqlFunc.AggregateSum(it.PlanNumber),
                        TypeName = it.TypeName,
                        TypeEncode = it.TypeEncode,
                        unitsName = SqlFunc.Subqueryable<实体表2>().Where(s => s.Id == it.UnitId).Select(s => s.Name),
                        warehouseName = SqlFunc.Subqueryable<实体表3>().Where(a=>a.Id==it.WareHId).Select(a=>a.TypeName),
                        warehouseModelName = SqlFunc.Subqueryable<实体表4>().Where(b=>b.Id==it.WareHModelId).Select(b=>b.TypeName)
                    })
                    .ToPageListAsync(model.Page, model.Limit, totalCount);

这一次我并没有把Dto接管成一个表在进行GroupBy操作,而是直接对我们的实体表进行GroupBy操作,大家可以看到我在往Dto里面赋值的时候里面字段我用到了子查询。
使用这个方法我们的功能已经可以完美展现到页面上了,最后认识一下吧,我叫闲齁齁,一枚用发量写代码的程序员,期待与大家一起成长一起进步。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风偷吻云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值