2012-05-22 11 views
6

Fondamentalmente, voglio usare la sintassi Dapper "carina" per una stored procedure, senza dover utilizzare manualmente exec MySproc @p1, @p2, @p3, @p4 e così via, ma ho bisogno di essere in grado di passare in un oggetto fortemente tipizzato con varie proprietà impostate e avere questo oggetto essere utilizzato per mappare i parametri. So che posso farlo con un oggetto anonimo, ma lo scenario che sto pensando sarebbe qualcosa di simile a un modulo di ricerca complesso in cui diversi campi possono essere cercati, e la stored procedure corrispondente può avere molti parametri (molti con i valori predefiniti).Dapper supporta oggetti fortemente tipizzati con una stored procedure?

Idealmente avrei voluto essere in grado di fare qualcosa del genere:

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(); 

tuttavia, che non funziona e genera un errore perché il mio oggetto cliente può avere una dozzina o più proprietà, e ho sto solo cercando due in questo caso; Dapper sembra semplicemente controllando ogni proprietà e assegnando un valore, supponendo che ci sia un parametro corrispondente nella sproc quando potrebbe non esserci.

Posso fare qualcosa di simile a questo utilizzando PetaPoco (passaggio in un oggetto fortemente tipizzato o un oggetto anonimo) ma sto cercando qualcosa di un po 'più astratto di PetaPoco.

È quello che voglio fare in Dapper (o un altro micro-ORM? Non posso usare NHibernate o un ORM pesante), o c'è un modo che sto trascurando per ottenere la stessa funzionalità a corto di dover scrivere un dichiarazione di exec con quello che potrebbe essere una dozzina di parametri?

risposta

9

Se volete specificare i params sarà necessario farlo in modo esplicito:

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(); 

Noi non facciamo un sp_help params annusano per procs anche se si potrebbe costruire un aiutante che lo fa e consente per eseguire: cust.ToProcParams('MySproc')

In alternativa, se si desidera creare questo parametro in modo dinamico, è possibile utilizzare.

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

Questo è ciò di cui avevo paura, poiché l'utilizzo degli oggetti anonimi mi impedisce di creare un oggetto dinamicamente in base agli input. L'idea del metodo helper è interessante, però. –

+1

@WayneM vedi la mia modifica ... –

+0

Ora sembra interessante. Dovrò giocarci e vedere come funziona. Molto apprezzato, Sam! –

2

Se si utilizza SQL Server, consultare Insight.Database. https://github.com/jonwagner/Insight.Database/wiki È più orientato verso le stored procedure e utilizza SqlDeriveParameters per determinare il mapping tra gli oggetti e le stored procedure.

NOTA: attualmente richiede .NET 4.0, ma se sei veramente interessato a una versione .NET 3.5, posso vedere quanto sarebbe difficile.

Problemi correlati