iT邦幫忙

6

【C#】Dapper應用 #1 : QueryMultiple

c#
暐翰 2018-04-08 01:20:4712491 瀏覽

說明:

寫SQL Script的時候,常會需要返回多個結果的情況
但在程式端呼叫時,需要拆成多個reqesut向資料庫請求

假如數量一多這樣效率就會變差
這時候可以使用Dapper的QueryMutiple方法

只需要一個reqeust就可以返回多個結果

舉例(使用LINQPAD):

使用之前回答別人問題時,寫的簡單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,打完收工,有疑問可以留言給我 :-)


1 則留言

0

哈哈哈,被標記了,謝謝大大
原來 QueryMultiple 的原理是這樣,平常只會用,沒有特別想它的原理,
您整理分析後,蠻好理解的。
/images/emoticon/emoticon25.gif

暐翰 iT邦大師 1 級 ‧ 2018-04-10 09:33:40 檢舉

覺得你的文章寫得很好,所以推薦
/images/emoticon/emoticon12.gif

我要留言

立即登入留言