Dapper prend-il en charge les objets fortement typés avec une procédure stockée?

dapper query-by-example stored-procedures

Question

Fondamentalement, je veux utiliser la syntaxe "nice" Dapper pour une procédure stockée, sans avoir à utiliser manuellement exec MySproc @p1, @p2, @p3, @p4 et ainsi de suite, mais je dois pouvoir transmettre objet typé avec différentes propriétés définies et cet objet être utilisé pour mapper les paramètres. Je sais que je peux le faire avec un objet anonyme, mais le scénario auquel je pense serait quelque chose comme un formulaire de recherche complexe où plusieurs champs peuvent être recherchés, et la procédure stockée correspondante peut avoir beaucoup de paramètres (beaucoup avec des paramètres par défaut). ).

Idéalement, je voudrais pouvoir faire quelque chose comme ça:

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

Cependant, cela ne fonctionne pas et génère une erreur car mon objet Client peut avoir une douzaine ou plus de propriétés, et je n'en recherche que deux dans ce cas; Dapper semble juste vérifier chaque propriété et assigner une valeur, en supposant qu'il y ait un paramètre correspondant dans le sproc quand il n'y en a pas.

Je peux faire quelque chose de similaire avec PetaPoco (passer un objet fortement typé ou un objet anonyme) mais je cherche quelque chose de plus abstrait que PetaPoco.

Est-ce que ce que je veux faire est possible dans Dapper (ou un autre micro-ORM? Je ne peux pas utiliser NHibernate ou un ORM de poids lourd), ou y a-t-il une façon d'éviter d'avoir à écrire pourrait être une douzaine de paramètres?

Réponse acceptée

Si vous souhaitez spécifier les paramètres, vous devrez le faire explicitement:

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

Nous ne faisons pas de sp_help params sniff pour procs bien que vous puissiez potentiellement créer un assistant qui fait cela et vous permet d'exécuter: cust.ToProcParams('MySproc')

Sinon, si vous voulez construire ce paramètre dynamiquement, vous pouvez utiliser.

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

Réponse populaire

Si vous utilisez SQL Server, consultez Insight.Database. https://github.com/jonwagner/Insight.Database/wiki Il est plus orienté vers les procédures stockées et utilise SqlDeriveParameters pour déterminer le mappage entre les objets et les procédures stockées.

NOTE: il nécessite actuellement .NET 4.0, mais si vous êtes vraiment intéressé par une version .NET 3.5, je peux voir à quel point cela sera difficile.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi