使用方式例子 :
using (var cn = Connection)
{
using (var gridReader = cn.QueryMultiple("select 1; select 2;"))
{
Console.WriteLine(gridReader.Read<int>()); //result : 1
Console.WriteLine(gridReader.Read<int>()); //result : 2
}
}
使用QueryMultiple優點 :
減少Reqeust次數
共用同一組Parameter參數
QueryMultiple的底層實作邏輯 :
DataReader NextResult
取得下一組查詢結果沒有
下一組查詢結果才會將DataReader釋放
緩存的算法多增加gridIndex判斷,主要對每個result mapping動作做一個緩存,Emit IL的邏輯跟Query一樣。
注意Read方法使用的是buffer = true = 返回結果直接ToList保存在記憶體,所以沒有延遲查詢特性。
Dapper 呼叫QueryMultiple方法時會將DataReader封裝在GridReader物件內,只有當最後一次Read
動作後才會回收DataReader
所以沒有讀取完
再開一個GridReader > Read會出現錯誤:已經開啟一個與這個 Command 相關的 DataReader,必須先將它關閉
。
要避免以上情況,可以改成using
區塊方式,運行完區塊代碼後就會自動釋放DataReader
using (var gridReader = cn.QueryMultiple("select 1; select 2;"))
{
//略..
}
感覺Dapper GridReader好像有機會可以實作是否有NextResult
方法,這樣就可以配合while
方法一次讀取完多組查詢資料
,等之後有空來想想有沒有機會做成。
概念代碼 :
public static class DbExtension
{
public static IEnumerable<IEnumerable<dynamic>> GetMultipleResult(this IDbConnection cn,string sql, object paramters)
{
using (var reader = cn.QueryMultiple(sql,paramters))
{
while(reader.NextResult())
{
yield return reader.Read();
}
}
}
}