2012-01-24 2 views
16

Dapperを使用してASP.NET SQLメンバシッププロバイダテーブルとのインターフェイスを作成しようとしています。私はSqlMembershipProviderクラスをラップし、私が持っているカスタムテーブルに関連する特定の基準が与えられたMembershipUsersを得るための追加のメソッドを追加しました。Dapperでカスタムコンストラクタを呼び出しますか?

Dapperを使用してデータをクエリすると、Dapperはまずパラメータなしのコンストラクタを使用してクラスをインスタンス化し、返された列をオブジェクトのプロパティに「マップする」ように見えます。

ただし、MembershipUserクラスのUserNameプロパティにはセッターがありません。 Dapper SqlMapper.csの行1417から判断すると、GetSettableProps()メソッドは設定可能なプロパティのみを取得します。

コンストラクタを呼び出すためにMultiMapクエリを実行しようとしましたが、クエリに渡されたオブジェクトにUserNameが既に不足しているという問題があります。

私はGetSettableProps()メソッドを変更できると推測していますが、それがうまくいくかどうか、または既存のコードに影響するかどうかはわかりません。

私は、MembershipUserクラスにあるカスタムコンストラクタを呼び出すことはできますか?

また、状況をサポートするためにDapperに合理的な変更を加えることはできますか?

** UPDATE **

非ジェネリック/ダイナミッククエリ()メソッドを使用するには、マルクの答えは正解だったが、後世のために、これは私が内部Dapperのに言及していた方法は次のとおりです。

static List<PropInfo> GetSettableProps(Type t) 
{ 
    return t 
      .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 
      .Select(p => new PropInfo 
      { 
       Name = p.Name, 
       Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), 
       Type = p.PropertyType 
      }) 
      .Where(info => info.Setter != null) 
      .ToList(); 
} 
+0

..? – MethodMan

+1

正直言って、私はちょうどここで中間のタイプを使用しています - または非ジェネリッククエリAPI( "ダイナミック"経由)...私はprotobufネットから持ち上げることができるいくつかのコードを持っていますが、本当にそれが有益だろうと確信していません... –

答えて

24

私はあなたの両方のデフォルト以外のコを使用することができ、これを使用して...ここに

return connection.Query(sql, args).Select(row => 
    new AnyType((string)row.Foo, (int)row.Bar) { 
     Other = (float)row.Other }).ToList(); 

を非ジェネリッククエリAPIを使用します動的ステップを中間ステップとして使用することで、変更なしで、ネスト・ストラクチャとプロパティ・アサインメントを作成できます。私はこれを使用

+0

うわー、私はそれを完全に逃してしまったのは恥ずかしいです! –

+3

この方法では、すべてのプロパティを明示的に設定する必要がありますか?たとえば、自分のタイプを構築できない場合、Dapperは自動的に結果を設定してプロパティを処理しますか? – crush

+3

ダイナミックを使用するこのソリューションには、すべてがFramework v4で動作するわけではありません。ディクショナリインデックスを使用して列の値を取得すると、動的でなくなってしまう可能性があります。つまり、Marcが(int)row.Bar(行はDapperのv4では動的です))、 Bar "(Dapper 3.5の行は辞書です)などです。それは楽しいものではありませんが、おそらく必要な場合もあります。 – Nij

1

は、多分それは助ける誰か

ところでなどのライン1417の外観は、あなたが多分すぐにあなたを助けることができる他の人のためにあなたのコードの例を投稿することができないものを
YourList = connection.Query<YourQueryClass>(Query, arg) 
       .Select(f => new ClassWithConstructor(f.foo,f.bar)) 
       .ToList(); 
関連する問題