说明:
写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_Tableset [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,打完收工,有疑问可以留言给我 :-)