Dapper.NET e proc armazenado com vários conjuntos de resultados

Existe alguma maneira de usar o Dapper.NET com procs armazenados que retornam vários conjuntos de resultados?

No meu caso, o primeiro conjunto de resultados é uma única linha com uma única coluna; se for 0 , a chamada foi bem-sucedida e o segundo conjunto de resultados conterá as linhas / colunas reais de dados. (e se não for zero, ocorreu um erro e nenhum segundo conjunto de resultados será fornecido)

Alguma chance de lidar com isso com o Dapper.NET? Até agora, só recebo o único 0 – mas nada mais.

Atualização: OK, funciona bem – desde que o resultado seja definido como não. 2 é uma entidade única:

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

Agora, tenho outro requisito.

O multi-mapeamento do Dapper (dividindo uma única linha retornada do SQL Server em duas entidades separadas) para esse segundo conjunto de resultados não parece ser suportado até o momento (pelo menos não parece haver uma sobrecarga de .Read que pode lidar com multi-mapeamento).

Como posso dividir essa linha em duas entidades?

Você já tentou o método QueryMultiple ? Diz que deveria:

Execute um comando que retorne vários conjuntos de resultados e acesse cada um por sua vez

QueryMultiple suporta a capacidade de lidar com vários conjuntos de resultados. A única restrição de design que adicionamos foi a desativação total do buffer para o leitor de grade. Isso significa que toda a API está fluindo .

No caso mais simples, você pode usar:

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

No caso um pouco mais sofisticado, você pode fazer coisas malucas como esta:

 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>( (a, b) => Tuple.Create((object)a, (object)b)).ToList(); var result2 = grid.Read>( (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("r").IsEqualTo(11); 

Conjunto de resultados múltiplos.

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

Procedimento armazenado:

 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