Pregunta

¿Hay alguna forma de usar dapper.net con procesos almacenados que devuelven múltiples conjuntos de resultados?

En mi caso, el primer conjunto de resultados es una sola fila con una sola columna; si es 0 Luego, la llamada fue exitosa, y el segundo conjunto de resultados contendrá esas filas/columnas reales de datos. (y si no era cero, se produjo un error y no se proporcionará ningún segundo conjunto de resultados)

¿Alguna posibilidad de manejar esto con dapper.net? Hasta ahora, solo estoy recuperando ese single 0 - Pero nada más.

Actualizar: Ok, funciona bien, siempre que el resultado se estableció no. 2 es una sola entidad:

Dapper.SqlMapper.GridReader reader = 
    _conn.QueryMultiple("sprocname", dynParams, 
    commandType: CommandType.StoredProcedure);

int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();

Ahora tengo aún otra requisito.

El mapeo múltiple de Dapper (dividir una sola fila regresó del servidor SQL en dos entidades separadas) para ese segundo conjunto de resultados no parece ser compatible hasta el momento (al menos no parece haber una sobrecarga de sobrecarga de .Read<T> que puede manejar múltiples mapeo).

¿Cómo puedo dividir esa fila en dos entidades?

¿Fue útil?

Solución

¿Has probado el QueryMultiple ¿método? Dice que debería:

Ejecutar un comando que devuelva múltiples conjuntos de resultados y acceda a cada uno a su vez

Deberá agregar esto usando la declaración para habilitar QueryMultiple.

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */

Otros consejos

QueryMultiple Admite la capacidad de lidiar con múltiples conjuntos de resultados. La única restricción de diseño que agregamos fue deshabilitar totalmente el almacenamiento en búfer para el lector de la cuadrícula. Esto significa que toda la API es transmisión.

En el caso más simple que puede usar:

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

En el caso un poco más sofisticado, puedes hacer cosas locas 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<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);

Deberá agregar esto usando la declaración para habilitar QueryMultiple.

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */

Conjunto de resultados múltiples.

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();

Deberá agregar esto usando la declaración para habilitar QueryMultiple.

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */

Procedimiento almacenado:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top