Dapper.NET和存储过程与多个结果集

有没有办法使用Dapper.NET与存储过程返回多个结果集?

在我的情况下,第一个结果集是单列单列, 如果它是0那么调用成功,第二个结果集将包含实际的行/列数据。 (如果它不为零,则会发生错误,并且不会提供第二个结果集)

有没有机会用Dapper.NET来处理这个问题? 到目前为止,我只能回到这个单一的0 – 但没有更多。

更新:好吧,它工作正常 – 只要结果集没有。 2是一个单一的实体:

 Dapper.SqlMapper.GridReader reader = _conn.QueryMultiple("sprocname", dynParams, commandType: CommandType.StoredProcedure); int status = reader.Read<int>().FirstOrDefault(); MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault(); 

现在,我还有另一个要求。

对于第二个结果集,Dapper的多重映射(将从SQL Server返回的单个行拆分成两个单独的实体)似乎还没有被支持(至less似乎没有.Read<T>可以处理多重映射)。

我怎样才能拆分成两个实体的行?

你有没有尝试过QueryMultiple方法? 它说它应该:

执行一个返回多个结果集的命令,并依次访问每个结果集

QueryMultiple支持处理多个结果集的能力。 我们添加的唯一devise限制是完全禁用网格读取器的缓冲。 这意味着整个API是stream媒体

在最简单的情况下,您可以使用:

 var grid = connection.QueryMultiple("select 1 select 2"); grid.Read<int>().First().IsEqualTo(1); grid.Read<int>().First().IsEqualTo(2); 

在稍微复杂的情况下,你可以做这样的疯狂的东西:

 var p = new DynamicParameters(); p.Add("a", 11); p.Add("r", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(@"create proc #spEcho @a int as begin select @a Id, 'ping' Name, 1 Id, 'pong1' Name select @a Id, 'ping' Name, 2 Id, 'pong2' Name return @a end"); var grid = connection.QueryMultiple("#spEcho", p, commandType: CommandType.StoredProcedure); var result1 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>( (a, b) => Tuple.Create((object)a, (object)b)).ToList(); var result2 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>( (a, b) => Tuple.Create((object)a, (object)b)).ToList(); ((int)(result1[0].Item1.Id)).IsEqualTo(11); ((int)(result1[0].Item2.Id)).IsEqualTo(1); ((int)(result2[0].Item1.Id)).IsEqualTo(11); ((int)(result2[0].Item2.Id)).IsEqualTo(2); p.Get<int>("r").IsEqualTo(11); 

多个结果集。 (由于安全原因,我认为Oracle没有查询倍数)。

 var reader = conn.QueryMultiple("ProductSearch", param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, commandType: CommandType.StoredProcedure); var CategoryOneList = reader.Read<CategoryOne>().ToList(); var CategoryTwoList = reader.Read<CategoryTwo>().ToList(); 

存储过程:

 CREATE PROCEDURE [dbo].[ProductSearch] @CategoryID as varchar(20), @SubCategoryID as varchar(20), @PageNumber as varchar(20) AS BEGIN SELECT * FROM ProductTbl SELECT * FROM ProductTbl END 
Interesting Posts