NewLife.XCode是一個有15年歷史的開源數據中間件,支持netcore/net45/net40,由新生命團隊(2002~2020)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例代碼和運行日志來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大數據實時計算項目。
開源地址:https://github.com/NewLifeX/X (求star, 1067+)
XCode以添刪改查為基礎,進一步發展了數據統計與分析,本篇將作為大數據分析處理開篇!
!!閱讀本文之前,建議閱讀《高級查詢》。
分組統計
回顧前文,所有查詢的標准結構都是 Select xxx From table Where yyy Order By zzz Limit 0, 20
分組查詢也不例外,僅僅是在where子句處做文章。
對於最標准的5參數查詢,FindAll(String where, String order, String selects, Int64 startRowIndex, Int64 maximumRows),分組查詢就寫在where參數里面,直接group by字段,甚至還可以 having 。
為了減少字符串拼接的失誤,常用以下擴展寫法:
1,條件表達式WhereExpression后用GroupBy擴展方法,多個待排序字段作為參數
2,條件后加上字段GroupBy,該用法很接近sql寫法 where enable=1 group by roleid,缺點就是不支持多個排序字段
如果這兩種擴展都無法滿足要求,那就直接拼接where字符串吧。
聚合函數
光有分組查詢足夠,往往還需要配合使用聚合函數,如 Count/Sum/Max/Min/Avg 等。
在標准數據查詢中,這屬於Select部分。
常用 FindAll(Expression where, PageParameter page = null, String selects = null) 中,我們把需要聚合的表達式卸載selects參數里面。
- _.ID.Count() 表示對ID字段做Count計算,默認還是映射到ID字段,計算結構取值時 list[0].ID 就是 count()值
- _.Logins.Sum() 取 Logins 字段累加,默認映射到 Logins,取結果 list[0].Logins。
- Sum(aliasName) 也可以指定別名,如果aliasName不是實體類字段,XCode無法映射,只能這樣取值 list[0][aliasName]
- 最后兩個是分組字段,由於運算符重載的緣故,它們不能放在第一位,可以放在第二位開始的任意位置。
最后得到的SQL語句如下:
Select Count(ID) as ID,Sum(Logins) as Logins,Max(LastLogin) as LastLogin,RoleID,DepartmentID From User Where Enable=1 Group By RoleID,DepartmentID
以上介紹了高級統計的基本用法,實際項目中需要靈活應用。
近幾年工作中,經常用到多字段表達式聚合,並且根據需要寫一些擴展,如Oracle中 _.Status.CaseSum(0, "S0") & _.Status.CaseSum(1, "S1") & _.Status.CaseSum(2, "S2")
CaseSum不受XCode支持,因其只能用在Oracle上,所以在應用項目里面給 FieldItem 做了一個擴展方法。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,代碼配置連接字符串
- 數據模型文件。建立表格字段和索引,名字以及數據類型規范,推薦字段(時間,用戶,IP)
- 實體類詳解。數據類業務類,泛型基類,接口
- 功能設置。連接字符串,調試開關,SQL日志,慢日志,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
- 反向工程。自動建立數據庫數據表
- 數據初始化。InitData寫入初始化數據
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 臟數據。如何產生,怎么利用
- 增量累加。高並發統計
- 事務處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關聯,Map映射
- 高級查詢。復雜條件,分頁,自定義擴展FieldItem,查總記錄數,查匯總統計
- 數據層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數據較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數據,通用處理程序
- 角色權限。Membership
- 導入導出。Xml,Json,二進制,網絡或文件
- 分表分庫。常見拆分邏輯
- 高級統計。聚合統計,分組統計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數據,恢復數據,同步數據
- 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
- 大數據分析。ETL抽取,調度計算處理,結果持久化