¿Cómo puedo usar Dapper's QueryMultiple con un procedimiento almacenado, pero con un valor de parámetro diferente cada vez?

c# dapper sql-server

Pregunta

Quiero llamar a un procedimiento almacenado a granel con Dapper. Cada llamada devolverá un conjunto diferente de resultados, por lo que estaba usando QueryMultiple. Si creo los parámetros de esta manera:

    var parameters = new DynamicParameters();
    // The stored proc accepts a single integer, but I want to pass multiple so each call had a new value.
    parameters.Add("LookupID", lookupIds); 

    var resultSet = connection.QueryMultiple("SPName", parameters, commandType: System.Data.CommandType.StoredProcedure);

Aparece un error que indica que el procedimiento almacenado tiene demasiados argumentos especificados. Entonces, ¿de qué otra manera puedo lograr esto?

Respuesta experta

QueryMultiple trata de los resultados, no de las entradas. Para hacer lo que desea, debe llamar al SP muchas veces. Lo cual puede hacer a través de un simple bucle foreach , o muchos (no todos) de los métodos IEnumerable<T> permitirán un método de conveniencia al pasar un IEnumerable<T> como el objeto más externo, por ejemplo:

int[] ids = ...
var args = ids.Select(id => new { id, val = "ABC" });
db.Execute("whatever", args);

Que ejecutará el SQL una vez por artículo pasando en @id y @val para cada uno. En el caso de la API async esto también se puede combinar con MARS para eliminar el costo de latencia entre llamadas, pero esto es opcional porque MARS no es una opción predeterminada.

Alternativamente, podría escribir un nuevo envoltorio SP que tome un único parámetro y lo divida (el nuevo string_split sería ideal) y realice el ciclo en el servidor.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué