7

私は最近、生成されているSQLにあまり満足しておらず、それをより細かく制御したいと思っていたため、EFの潜在的な代替品としてDapperの評価を開始しました。ドメインモデルでの複雑なオブジェクトのマッピングについて質問があります。Providerというオブジェクトがあるとしましょう。Providerには、親プロバイダーオブジェクト(つまり、集約ルート)を経由することによってのみアクセスする必要があるIEnumerableタイプのいくつかのプロパティを含めることができます。QueryMultipleとMap拡張メソッドの使用について説明している同様の投稿を見たことがありますが、Dapperが一挙にこれを実行できるのであれば、ロードされたオブジェクトグラフ全体を元に戻すメソッドを作成する方法を考えていました。またはそれが少しずつ行われる必要がある場合。例として、私のオブジェクトが次のようになっているとしましょう。

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を使用してオブジェクトグラフ全体にデータを入力する簡単な方法はありますか?

4

1 に答える 1

9

私も似たような状況です。すべてのサブオブジェクトが戻ってくるように、SQL リターンをフラットにしました。次に、Query<> を使用して完全なセットをマップします。あなたのセットがどれくらい大きいかわかりません。

だから、このようなもの:

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

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

例:

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

分割は「ID,fooid,BarName,foobarid」になります。戻りセットを実行すると、各オブジェクトで検出できるプロパティがマップされます。

これがお役に立てば幸いです。また、リターン セットが大きすぎてフラットに戻らないことを願っています。

于 2011-09-04T14:10:00.240 に答える