¿Admite Dapper objetos fuertemente tipados con un procedimiento almacenado?

dapper query-by-example stored-procedures

Pregunta

Básicamente, quiero usar la sintaxis de Dapper "agradable" para un procedimiento almacenado, sin tener que usar manualmente exec MySproc @p1, @p2, @p3, @p4 y demás, pero necesito poder pasar un fuerte objeto tipeado con varias propiedades establecidas y que este objeto se use para mapear los parámetros. Sé que puedo hacer esto con un objeto anónimo, pero el escenario en el que estoy pensando sería algo así como un formulario de búsqueda complejo donde se pueden buscar varios campos, y el procedimiento almacenado correspondiente puede tener bastantes parámetros (muchos con valores predeterminados). )

Idealmente, me gustaría poder hacer algo como esto:

var cust = new Customer();
cust.FirstName = ...
cust.LastName = ...

// using .NET 3.5 so need to use ugly syntax :(
var result = connection.Query<Customer>("MySproc", cust, null, false, null, CommandType.StoredProcedure).Single();

sin embargo, eso no funciona y arroja un error porque mi objeto Cliente puede tener una docena o más propiedades, y solo estoy buscando dos en este caso; Dapper parece estar simplemente comprobando cada propiedad y asignando un valor, suponiendo que hay un parámetro correspondiente en el sproc cuando podría no existir.

Puedo hacer algo similar a esto usando PetaPoco (paso en un objeto fuertemente tipado o un objeto anónimo) pero estoy buscando algo un poco más abstracto que PetaPoco.

¿Es posible lo que quiero hacer en Dapper (u otro micro-ORM? No puedo usar NHibernate o un ORM pesado), o hay una manera en que estoy pasando por alto para obtener la misma funcionalidad, salvo tener que escribir una declaración ejecutiva con qué podría ser una docena de parámetros?

Respuesta aceptada

Si desea especificar los parámetros, deberá hacerlo explícitamente:

var result = connection.Query<Customer>("MySproc", 
     new {cust.Id, cust.Name}, // specify the params you want to give it.  
     null, 
     false, 
     null, 
     CommandType.StoredProcedure).Single();

No hacemos un sp_help parametros de sp_help para procs, aunque podrías construir un helper que lo haga y te permita ejecutar: cust.ToProcParams('MySproc')

Alternativamente, si quiere construir este parámetro dinámicamente, puede usar.

var dp = new DynamicParameters(); 
dp.Add("Id", cust.Id);
dp.Add("Name", cust.Name);
var result = connection.Query<Customer>("MySproc", 
         dp,
         null, 
         false, 
         null, 
         CommandType.StoredProcedure).Single();

Respuesta popular

Si está utilizando SQL Server, consulte Insight.Database. https://github.com/jonwagner/Insight.Database/wiki Está más orientado a los procedimientos almacenados y usa SqlDeriveParameters para determinar la asignación entre los objetos y los procedimientos almacenados.

NOTA: actualmente requiere .NET 4.0, pero si realmente está interesado en una versión .NET 3.5, puedo ver lo difícil que sería.



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é