[Dapper] 取得多筆查詢結果 QueryMultiple 擴充寫法
之前曾經想把Dapper的QueryMultiple寫一個擴充方法,希望在使用的時候可以預期有幾個不同類型的回傳結果,並在定義後一次取回,不過當下由於時間上有點趕,後來就作罷了。最近剛好有點時間,在研究了一下之後終於讓我給寫出來了。
範例:
說明:要執行一個StoredProcedure,預期會有四個回傳結果,其中第1,3,4個結果是字串並沒有資料欄位名稱,第2個結果有兩個欄位。
實作:
1.建立SqlHelper 實作 QueryMultiple 的擴充方法
/// <summary> /// QueryMultiple /// </summary> /// <param name="sql">指令</param> /// <param name="query">參數</param> /// <param name="types">回傳的結果類型(照順序)</param> /// <returns></returns> public static IEnumerable<IEnumerable<dynamic>> QueryMultiple(string sql, object query, params Type[] types) { using (var conn = new SqlConnection(_connectString)) { var reader = conn.QueryMultiple(sql, query); var i = 0; while (!reader.IsConsumed) { if (i >= types.Length) { break; } var data = reader.Read(types[i]); i++; yield return data; } } } /// <summary> /// 依 Index 取得 多筆結果 值 /// </summary> /// <typeparam name="T">資料類別</typeparam> /// <param name="datas">回傳結果</param> /// <param name="index">Index</param> /// <returns></returns> public static T[] GetMultipleResult<T>(IEnumerable<dynamic>[] datas ,int index) { if(index>= datas.Length) { return default; } var result = datas[index].Select(x => (T)x).ToArray(); return result; }
2.取得查詢結果
var datas = SqlHelper.QueryMultiple(sql, query, typeof(string), typeof(Result2Model), typeof(string), typeof(string)).ToArray(); var result = new ResultModel() { Table0 = SqlHelper.GetMultipleResult(datas, 0), Table1 = SqlHelper.GetMultipleResult (datas, 1), Table2 = SqlHelper.GetMultipleResult (datas, 2), Table3 = SqlHelper.GetMultipleResult (datas, 3), };
留言
張貼留言