寫SQL Script的時候,常會需要返回多個結果的情況
但在程式端呼叫時,需要拆成多個reqesut向資料庫請求
假如數量一多這樣效率就會變差
這時候可以使用Dapper的QueryMutiple方法
只需要一個reqeust就可以返回多個結果
使用之前回答別人問題時,寫的簡單script:
我可以先查詢未被更新的資料
接著做更新動作
再查詢更新完的資料
以上動作我只要使用一個Request就可以完成
void Main()
{
var sql = @"
--【以下建立測試資料數據】
create table #Tem_Table ([Creat_Time] datetime,[Update_Time] datetime,[InFo] nvarchar(5));
insert into #Tem_Table ([Creat_Time],[Update_Time] ,[InFo]) values
('2018/04/03 12:00:00.000','2018/04/03 12:00:00.000','False')
,('2018/02/03 12:00:00.000','2018/03/04 12:00:00.000','False')
,('2018/03/03 12:00:00.000','2018/01/04 12:00:00.000','False')
;
--原先資料打印
select * from #Tem_Table;
--更新動作
update #Tem_Table
set [Creat_Time] = case when not [Creat_Time]=[Update_Time] then [Update_Time] else [Creat_Time] end
,[InFo] = case when not [Creat_Time]=[Update_Time] then 'True'else [InFo] end
--更新資料打印
select * from #Tem_Table;
";
//執行查詢,獲取結果集集合
var multi = this.Connection.QueryMultiple(sql);
var dynamic_result_1 = multi.Read().ToList().Dump();
var dynamic_result_2 = multi.Read().ToList().Dump();
}
先使用QueryMultiple跟資料庫要資料,並序列化存到記憶體內(GridReader)
可以在SoureCode看到呼叫QueryMultiple方法時候會去呼叫QueryMultipleImpl
之後使用Read讀取資料(注意是讀取資料順序是按照SQL SELECT的順序)
可以在SoureCode看到呼叫Read方法時候會去呼叫ReadDeferred
接著反序列化並依照讀取index向記憶體讀取資料
假如要了解更多Dapper內容
推薦:[C#][ASP.NET] Web API 開發心得 (6) - 輕量級的 ORM 工具 Dapper + Slapper.AutoMapper
OK,打完收工,有疑問可以留言給我 :-)
哈哈哈,被標記了,謝謝大大
原來 QueryMultiple 的原理是這樣,平常只會用,沒有特別想它的原理,
您整理分析後,蠻好理解的。
覺得你的文章寫得很好,所以推薦