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里面賦值的時候里面欄位我用到了子查詢,
使用這個方法我們的功能已經可以完美展現到頁面上了,最后認識一下吧,我叫閑齁齁,一枚用發量寫代碼的程式員,期待與大家一起成長一起進步,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248553.html
標籤:其他
上一篇:有這樣一個男孩
下一篇:C++類和物件 | 類和物件
