2012-05-22 29 views
6

基本上,我想爲存儲過程使用「nice」Dapper語法,而不必手動使用exec MySproc @p1, @p2, @p3, @p4等等,但我需要能夠傳入強類型對象,並設置各種屬性並使此對象用於映射參數。我知道我可以用一個匿名對象來做到這一點,但我想到的場景就像是一個複雜的搜索表單,其中可以搜索多個字段,並且相應的存儲過程可以有很多參數(很多都有默認值)。Dapper是否支持使用存儲過程強類型化對象?

理想我希望能夠做這樣的事情:

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

,不工作,並拋出一個錯誤,因爲我的客戶對象可能有十幾個或更多的屬性,和我在這種情況下,我只尋找兩個; Dapper似乎只是檢查每個屬性並分配一個值,假設在sproc中有一個對應的參數可能不存在。

我能做類似這樣使用PetaPoco東西(傳遞一個強類型的對象一個匿名對象),但我要找的東西一點點比PetaPoco是更抽象。我想在Dapper(或者其他的微型ORM?我不能使用NHibernate或者一個重量級的ORM)中做什麼,或者我有一種方法可以忽略不計, exec聲明與什麼可能是十幾個參數?

回答

9

如果你想指定PARAMS你需要明確這樣做:

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

我們不做sp_help PARAMS嗅探特效雖然你可能會建立一個幫手,做的是,讓你運行:cust.ToProcParams('MySproc')

另外,如果你想動態地建立這個參數,你可以使用。

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

這就是我所害怕的,因爲使用匿名對象阻止我根據輸入動態地構建對象。不過,輔助方法的想法很有趣。 –

+1

@WayneM看到我的編輯... –

+0

現在看起來很有趣。我將不得不玩弄,看看它是如何工作的。非常感謝,山姆! –

2

如果您使用的是SQL Server,請檢查Insight.Database。 https://github.com/jonwagner/Insight.Database/wiki它更傾向於存儲過程,並使用SqlDeriveParameters來確定對象和存儲過程之間的映射。

注意:它目前需要.NET 4.0,但是如果您真的對.NET 3.5版本感興趣,我可以看到這將是多麼困難。