[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),
            };

留言

這個網誌中的熱門文章

[Visual Studio]位於網際網路或是限制區域上 或是檔案上標有 web 字樣 所以無法處理該檔案。若希望處理這些檔案 請移除 web 字樣。

[IIS] IIS執行時,發生拒絕存取路徑 問題

[SourceTree]修改使用者帳號密碼