2012-05-22 6 views
6

基本的には、exec MySproc @p1, @p2, @p3, @p4などを手作業で使用することなく、ストアドプロシージャの "素晴らしい" Dapper構文を使用したいと思いますが、さまざまなプロパティを設定して厳密に型指定されたオブジェクトを渡すことができる必要があります。パラメータをマップするために使用されます。私は匿名のオブジェクトでこれを行うことができますが、私が考えているシナリオは、いくつかのフィールドを検索することができる複雑な検索フォームのようなものであり、対応するストアドプロシージャは、 )。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(); 

、私のCustomerオブジェクトがダース以上の特性を有することができるので、仕事やエラーをスローしていない、と私この場合、2つしか探していない。 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はprocsのためににおいを嗅ぐしません。 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バージョンに本当に関心がある場合は、それがどれほど難しいかがわかります。

関連する問題