2011-08-29 12 views
5

私は最近、生成されているSQLに喜ばれていないので、DapperをEFの代わりに使う可能性を評価し始めました。ドメインモデルで複雑なオブジェクトのマッピングに関する質問があります。 Providerというオブジェクトがあるとしましょう。プロバイダーには、プロバイダのオブジェクト(つまり集約ルート)を経由してアクセスする必要があるIEnumerable型のいくつかのプロパティを含めることができます。私はQueryMultipleとMap拡張メソッドを使って説明した同様の記事を見てきましたが、Dapperがこれを行うことができるならばオブジェクトグラフをロードした全体のグラフを返すメソッドを記述したいのですがまたはそれが片付けられなければならない場合。例として、私のオブジェクトは、次のようなものを見ていると言うことができます:Dapper Correct Object/Aggregate Mapping

public AggregateRoot 
     { 
      public int Id {get;set;} 
      ...//simple properties 
      public IEnumerable<Foo> Foos 
      public IEnumerable<Bar> Bars 
      public IEnumerable<FooBar> FooBars 
      public SomeOtherEntity Entity 
      ... 
     } 

Dapperのを使用してオブジェクトグラフ全体を取り込むの簡単な方法はありますか?

+0

これに対していくつかの手動拡張を構築する必要があります。グラフの検出と自動SQL生成のための組み込みメソッドはありません –

+0

ありがとうございます。サム、自動ではなくSQLクエリ?それは可能ですか?さらに、もしそうなら、これはどうやって扱われますか?または、このタイプと複雑さの関係を処理するために別々のクエリが生成されていますか? – mreyeros

+0

午後の午後Samもう少し簡単な質問私はQueryメソッドで、メソッドのオーバーロードの1つを使って最大5つのオブジェクトに渡すことができることに気付きました。この方法を使って私がここで何をしようとしているのか、それを誤解していますか? – mreyeros

答えて

7

私は同様の状況があります。私はすべてのサブオブジェクトが戻って来るように、フラットな私のSQLを返しました。次に、クエリ<>を使用して完全なセットをマップします。あなたのセットがどれくらい大きいか分かりません。

したがって、このような何か:

var cnn = sqlconnection(); 

var results = cnn.Query<AggregateRoot,Foo,Bars,FooBar,someOtherEntity,AggregateRoot>("sqlsomething" 
       (ar,f,b,fb,soe)=>{ 
        ar.Foo = f; 
        ar.Bars = b; 
        ar.FooBar = fb; 
        ar.someotherentity = soe; 
        return ar; 

       },.....,spliton:"").FirstOrDefault(); 

だからクエリタグの最後のオブジェクトは、リターンオブジェクトです。 SplitOnの場合、マッピングを実行するフラットな配列としてリターンを考える必要があります。新しいマッピングがそこから開始するように、新しいオブジェクトごとに最初の戻り値を選択します。

例:

select ID,fooid, foo1,foo2,BarName,barsomething,foobarid foobaritem1,foobaritem2 from blah 

splitonは、 "ID、fooid、BarName、foobarid" になります。リターンセットを実行すると、各オブジェクトで見つけることができるプロパティがマップされます。

私は、これが役立ち、あなたの返品セットがフラットに戻るには大きすぎないと願っています。

+0

優れたArnej65は、間違いなく私を大いに助けます。 – mreyeros

+0

これは、クエリがストアドプロシージャにあるときにも可能ですか(つまり、ストアドプロシージャの引き渡しの引数を基本的に呼び出します)。 –

+1

@ KrzysztofBranickiはい。私の場合は、必要なすべてのデータを照会し、フラット出力に戻すプロシージャを格納していました。 – Arnej65