Dapper Correct Object / Aggregate Mapping - PullRequest
       2

Dapper Correct Object / Aggregate Mapping

5 голосов
/ 30 августа 2011

Я недавно начал оценивать Dapper как потенциальную замену EF, так как я не был слишком доволен генерируемым SQL и хотел больше контролировать его. У меня есть вопрос относительно отображения сложного объекта в моей модели предметной области. Допустим, у меня есть объект с именем 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?

1 Ответ

7 голосов
/ 04 сентября 2011

У меня похожая ситуация.Я сделал мой 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".Когда он пробегает возвращаемый набор, он отобразит свойства, которые он может найти в каждом объекте.

Я надеюсь, что это поможет, и что ваш возвращаемый набор не слишком велик, чтобы возвращать плоский.

...