Dapper supporta oggetti fortemente tipizzati con una stored procedure?

dapper query-by-example stored-procedures

Domanda

Fondamentalmente, voglio usare la sintassi Dapper "carina" per una stored procedure, senza dover usare manualmente exec MySproc @p1, @p2, @p3, @p4 e così via, ma devo essere in grado di passare in modo deciso oggetto digitato con varie proprietà impostate e utilizzare questo oggetto 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 ).

Idealmente, vorrei 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, ciò non funziona e genera un errore perché il mio oggetto Cliente può avere una dozzina o più proprietà e in questo caso sto cercando solo due; 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 usando 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 una dichiarazione exec con cosa potrebbe essere una dozzina di parametri?

Risposta accettata

Se si desidera specificare i parametri, è necessario farlo esplicitamente:

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

Non facciamo uno sp_help params sp_help per procs sebbene tu possa potenzialmente creare un helper che lo faccia e ti permette di eseguire: cust.ToProcParams('MySproc')

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

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

Risposta popolare

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.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché