2012-05-22 35 views
6

Básicamente, quiero usar la sintaxis Dapper "agradable" para un procedimiento almacenado, sin tener que usar manualmente exec MySproc @p1, @p2, @p3, @p4 y así sucesivamente, pero necesito poder pasar un objeto fuertemente tipado con varias propiedades establecidas y tener este objeto ser utilizado 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).)¿Admite Dapper objetos fuertemente tipados con un procedimiento almacenado?

Idealmente me gustaría ser capaz de 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(); 
embargo

, que no funciona y arroja un error porque mi objeto Cliente puede tener una docena o más propiedades, y yo 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 lo que quiero hacer posible 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 un declaración ejecutiva con lo que podría ser una docena de parámetros?

Respuesta

9

Si desea especificar los parametros que tendrá que hacerlo de forma explícita:

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 params huelen a procsos aunque potencialmente podría construir un ayudante que hace eso y le permite para ejecutar: cust.ToProcParams('MySproc')

Alternativamente, si desea construir este parámetro de forma dinámica, 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(); 
+0

Eso es lo que tenía miedo, ya que el uso de objetos anónimos me impide crear un objeto de forma dinámica en función de las entradas. La idea del método de ayuda es interesante, sin embargo. –

+1

@WayneM ver mi edición ... –

+0

Ahora que se ve interesante. Tendré que jugar con eso y ver cómo funciona. Muy apreciado, Sam! –

2

Si está utilizando SQL Server, consulte Insight.Database. https://github.com/jonwagner/Insight.Database/wiki Está más orientado a los procedimientos almacenados y utiliza 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.

Cuestiones relacionadas