7

基本的に、手動で使用する必要なく、ストアド プロシージャに「適切な」Dapper 構文を使用したいのですがexec MySproc @p1, @p2, @p3, @p4、さまざまなプロパティが設定された厳密に型指定されたオブジェクトを渡して、このオブジェクトを使用できるようにする必要があります。パラメータをマッピングします。匿名オブジェクトでこれを実行できることはわかっていますが、私が考えているシナリオは、複数のフィールドを検索できる複雑な検索フォームのようなもので、対応するストアド プロシージャには非常に多くのパラメーター (多くは既定値) を含めることができます。 )。

理想的には、次のようなことができるようになりたいと思います。

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を使用できません)で可能ですか、または同じ機能を取得するために見逃している方法はありますか?ダースのパラメータになる可能性がありますか?

4

2 に答える 2

10

パラメータを指定したい場合は、明示的に指定する必要があります:

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_helpproc の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();
于 2012-05-23T06:08:30.063 に答える
2

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

注:現在、.NET 4.0が必要ですが、.NET 3.5バージョンに本当に興味がある場合は、それがどれほど難しいかがわかります。

于 2012-05-29T21:00:52.987 に答える