Obtener el contenido de DynamicParameters en Dapper

c# dapper reflection

Pregunta

Estamos migrando bases de datos de Oracle a MySQL. Oracle y MySQL usan un personaje diferente para las variables de vinculación @ y : Estamos usando Dapper para consultar la base de datos. Pasamos DynamicParameters en Dapper y las variables de vinculación funcionan.

Lo que quiero hacer es ir a través de DynamicParameters y mirar el nombre del valor y cambiar el carácter en el frente y luego reemplazarlo en la cadena SQL también. Sé cómo haría esto.

El problema que tengo es que no puede enumerar los DynamicParameters para obtener la clave y el valor.

Mi idea es intentar obtener el campo privado <string, DynamicParameters.ParamInfo> parameters en tiempo de ejecución usando reflection. No puedo encontrar la manera de hacerlo funcionar como DynamicParameters.ParamInfo es una clase privada.

¿Alguna idea sobre lo que podría hacer?

Respuesta aceptada

Hay dos partes para su pregunta, primero:

Lo que quiero hacer es ir a través de DynamicParameters y mirar el nombre del valor y cambiar el carácter en el frente

y el segundo es:

luego reemplazarlo en la cadena SQL también

La primera parte me interesó para ver qué tan inteligente es Dapper. Demuestra que es lo suficientemente inteligente para manejar los argumentos que se le pasan en DynamicParameters . Considera que tienes lo siguiente:

// Source of the DynamicParameters
var args = new Dictionary<string,string>();
args.Add("@emailPromotion", "1");
// additional args goes here

// An example of how you build a DynamicParameters
var dbArgs = new DynamicParameters();
foreach (var pair in args) dbArgs.Add(pair.Key, pair.Value);

// The query - using SQL Server (AdventureWorks)
var sql = "select * from Person.Contact WHERE EmailPromotion = @EmailPromotion";

// The Dapper call (this works as expected)
var items = the_connection.Query<dynamic>(sql, dbArgs);    

Ahora digamos que migraste desde Oracle usando colon y pasaste tus DynamicParameters desde esta fuente:

var oracle_args = new Dictionary<string,string>();
oracle_args.Add(":emailPromotion", "1");

Si usa ese oracle_args con el resto del código dado anteriormente, seguirá funcionando. Es de esperar que no lo sea, ya que SQL Server no pudo entender el colon. Lo único que provocará un error es si la consulta misma ( var sql ) tiene el carácter no válido: los colon .

¿Cómo entonces eso se relaciona con tu pregunta? Esto significa que no tiene que preocuparse por la " primera parte " y dejar que Dapper haga su trabajo. Solo tiene que ocuparse de la " segunda parte " y ajustar sus consultas (sql). Y si tiene el control total de las consultas, entonces no debería darle ningún problema. Una simple sustitución de cadena haría el truco.



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é