2012-05-22 2 views
6

Grundsätzlich möchte ich die "nette" Dapper-Syntax für eine gespeicherte Prozedur verwenden, ohne exec MySproc @p1, @p2, @p3, @p4 usw. manuell zu verwenden, aber ich muss ein stark typisiertes Objekt mit verschiedenen Eigenschaften übergeben können und dieses Objekt haben verwendet werden, um die Parameter zuzuordnen. Ich weiß, dass ich das mit einem anonymen Objekt machen kann, aber das Szenario, an das ich denke, wäre so etwas wie ein komplexes Suchformular, wo mehrere Felder durchsucht werden können und die entsprechende gespeicherte Prozedur viele Parameter haben kann (viele mit Standardwerten)).Unterstützt Dapper stark typisierte Objekte mit einer gespeicherten Prozedur?

Im Idealfall würde ich möchte in der Lage sein, so etwas zu tun:

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

jedoch, die nicht funktioniert und wirft einen Fehler, weil mein Customer-Objekt ein Dutzend oder mehr Eigenschaften haben können, und ich Ich suche in diesem Fall nur zwei; Dapper scheint nur jede Eigenschaft zu überprüfen und einen Wert zuzuweisen, vorausgesetzt, es gibt einen entsprechenden Parameter im Sproc, wenn es nicht sein könnte.

Ich kann etwas ähnlich wie diese mit PetaPoco (in einem oder ein anonymes Objekt stark typisierte Objekt übergibt) tun, aber ich bin auf der Suche nach etwas mehr als abstrahierte PetaPoco ist.

Was kann ich in Dapper (oder einem anderen Mikro-ORM? Ich kann nicht NHibernate oder ein Schwergewicht ORM verwenden), oder gibt es eine Möglichkeit, die ich übersehen, um die gleiche Funktionalität kurz vor einem zu schreiben Exec Statement mit was könnte ein Dutzend Parameter sein?

Antwort

9

Wenn Sie die params angeben möchten, müssen Sie dies explizit tun:

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

Wir machen nicht ein sp_help params für Procs schnüffeln obwohl Sie möglicherweise einen Helfer, der das, und Sie tut bauen könnte erlaubt zu laufen: cust.ToProcParams('MySproc')

Alternativ, wenn Sie diesen Parameter dynamisch erstellen möchten, können Sie verwenden.

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

Davor hatte ich Angst, da die Verwendung der anonymen Objekte es mir unmöglich macht, ein Objekt basierend auf Eingaben dynamisch aufzubauen. Die Idee der Helfermethode ist jedoch interessant. –

+1

@WayneM siehe meine bearbeiten ... –

+0

Nun, das sieht interessant aus. Ich muss damit herumspielen und sehen, wie es funktioniert. Sehr geschätzt, Sam! –

2

Wenn Sie SQL Server verwenden, überprüfen Sie Insight.Database. https://github.com/jonwagner/Insight.Database/wiki Es ist mehr auf gespeicherte Prozeduren ausgerichtet und verwendet SqlDeriveParameters, um die Zuordnung zwischen Objekten und den gespeicherten Prozeduren zu bestimmen.

HINWEIS: Es erfordert derzeit .NET 4.0, aber wenn Sie wirklich an einer .NET 3.5-Version interessiert sind, kann ich sehen, wie schwer das wäre.

Verwandte Themen