在.NET開發中,.NET的JSON序列化反序列化工具除了Newtonsoft.Json和System.Text.Json其實還有很多優秀的開源的序列化和反序列化工具,這些工具有的性能更加優秀,更加輕量等特征。本文將彙總介紹這些.NET中常用的JSON序列化和反序列化工具,供大家選擇參考使用。 ** ...
目錄
背景
對於查詢數據列表的功能,需要分頁已經查詢總數。這裡涉及兩句SQL,一個是查詢分頁對應的數據,第二個是Count(*); 會導致部分重覆代碼和兩次的資料庫查詢。
解決方案
Dapper有封裝QueryMultipleAsync的非同步方法支持執行多條SQL,來減少資料庫查詢次數。
使用方法
public async Task<(IEnumerable<Log> list,int total)> GetListAsync() { string sql = @"SELECT sql_calc_found_rows id, mark1, mark2, mark3 FROM logs ORDER BY id ASC LIMIT @Offset, @PageSize; SELECT FOUND_ROWS() "; DynamicParameters parameters = new DynamicParameters(); parameters.Add("@Offset", 0); parameters.Add("@PageSize", 2); using var connection = _dapperContext.CreateConnection(); using var multi = await connection.QueryMultipleAsync(sql, parameters); var list = await multi.ReadAsync<Log>(); var total = await multi.ReadSingleAsync<int>(); return (list, total); }
這裡是查詢MYSQL,使用了sql_calc_found_rows在第一個查詢分頁數據的SQL中,第二條是SELECT FOUND_ROWS()來獲取Limit之外的行數。
使用QueryMultipleAsync方法返回的是一個GridReader對象。這個對象提供了一些方法讀取數據,比如
Read , ReadAsync |
返回可枚舉的動態類型 |
Read<T> , ReadAsync<T> |
返回 T 參數指定類型的枚舉 |
ReadFirst , ReadFirstAsync |
Returns the first row as a dynamic type |
ReadFirst<T> , ReadFirstAsync<T> |
將第一行作為動態類型返回 |
ReadFirstOrDefault , ReadFirstOrDefaultAsync |
返回第一行作為 T 類型參數指定類型的實例 |
ReadFirstOrDefault<T> , ReadFirstOrDefaultAsync<T> |
將第一行作為動態類型返回,如果未返回任何結果,則返回 null |
ReadSingle , ReadSingleAsync |
返回第一行作為 T 類型參數指定類型的實例,如果沒有返回結果則返回 null |
ReadSingle<T> , ReadSingleAsync<T> |
在預期只返回一行時使用。 返回動態類型 |
ReadSingleOrDefault , ReadSingleOrDefaultAsync |
在預期返回零行或一行時使用。 返回動態類型或 null |
示例中使用ReadAsync讀取數據,ReadSingleAsync讀取count然後返回元組
var list = await multi.ReadAsync<Log>(); var total = await multi.ReadSingleAsync<int>(); return (list, total);
總結
通過使用Dapper的QueryMultipleAsync一次性查詢多個結果,減少了與資料庫伺服器的請求次數。減少了代碼量。