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

留言
張貼留言