Luego de buscar en diferentes repositorios y sitios webs finalmente hemos dado con la resolución que te compartimos pronto.
Solución:
Lo siguiente debería funcionar:
var result = conn.Query(
"select code, name from mytable where id = ?id? order by name",
new id = 1 );
Importante: ver respuesta más reciente
En la compilación actual, la respuesta sería “no”, por dos razones:
- el código intenta filtrar los parámetros no utilizados, y actualmente los está eliminando a todos porque no puede encontrar nada como
@id
,:id
o?id
en el sql - el código para agregar valores de tipos usa un orden arbitrario (bueno, está bien: alfabético) para los parámetros (porque la reflexión no ofrece ninguna garantía sobre el orden de los miembros), lo que hace que los argumentos posicionales anónimos sean inestables
La buena noticia es que ambos son reparables.
- podemos condicionar el comportamiento de filtrado
- podemos detectar la categoría de tipos que tiene un constructor que coincide con todos los nombres de propiedades y usar las posiciones de los argumentos del constructor para determinar el orden sintético de las propiedades; los tipos anónimos entran en esta categoría
Al hacer esos cambios en mi clon local, ahora pasa lo siguiente:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
var row = conn.Query("select Id = ?, Age = ?", new DynamicParameters(
new foo = 12, bar = 23 // these names DO NOT MATTER!!!
) RemoveUnused = false ).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
Tenga en cuenta que actualmente estoy usando DynamicParameters
aquí para evitar agregar aún más sobrecargas a Query
/ Query
– porque esto debería agregarse a un número considerable de métodos. agregándolo a DynamicParameters
lo resuelve en un solo lugar.
Estoy abierto a recibir comentarios antes de impulsar esto. ¿Te parece útil?
Editar: con la adición de un funky smellsLikeOleDb
(no, no es broma), ahora podemos hacer esto aún más directamente:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
var row = conn.Query("select Id = ?, Age = ?",
new foo = 12, bar = 23 // these names DO NOT MATTER!!!
).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
Eres capaz de auxiliar nuestro estudio mostrando un comentario y puntuándolo te lo agradecemos.