Dapperはストアドプロシージャを使用して厳密に型指定されたオブジェクトをサポートしていますか?

dapper query-by-example stored-procedures

質問

基本的には、 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();

しかし、私のCustomerオブジェクトには12個以上のプロパティがあり、この場合は2つしか探していないので、これはうまくいかずエラーがスローされます。 Dapperは、sprocに対応するパラメータが存在しない場合には、それを仮定して、すべてのプロパティをチェックして値を割り当てているようです。

私はPetaPoco(強く型付けされたオブジェクト匿名オブジェクトを渡す)を使用してこれに似た何かをすることができますが、私はPetaPocoよりも少し抽象的なものを探しています。

私はDapper(または別のマイクロORM、またはNHibernateやヘビーウエイトORMを使うことはできません)で可能なことをやっていますか、同じ機能を得るために見逃している方法はありますか?ダースのパラメータかもしれない?

受け入れられた回答

パラメータを指定する場合は、明示的に行う必要があります。

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

私たちはprocsに対してsp_help params sniffを実行しませんが、それを行うヘルパーを潜在的に作成して実行することができます: 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();

人気のある回答

SQL Serverを使用している場合は、Insight.Databaseをチェックしてください。 https://github.com/jonwagner/Insight.Database/wikiこれはストアドプロシージャに対してより重視され、オブジェクトとストアドプロシージャの間のマッピングを決定するためにSqlDeriveParametersを使用します。

注:現在.NET 4.0が必要ですが、.NET 3.5バージョンに本当に関心があるなら、それがどれくらい難しいかを知ることができます。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ