Dapper Correct Object / Aggregate Mapping

Недавно я начал рассматривать 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?


person mreyeros    schedule 29.08.2011    source источник
comment
вам придется создать некоторые ручные расширения для этого, нет встроенного метода для обнаружения графа и автоматического создания SQL   -  person Sam Saffron    schedule 30.08.2011
comment
Спасибо за ответ. Сэм, а как насчет решения, которое не является автоматическим, а использует SQL-запрос? Это возможно? Кроме того, как это обрабатывается в SO, если вообще? Или генерируются отдельные запросы для обработки отношений такого типа и сложности?   -  person mreyeros    schedule 30.08.2011
comment
Добрый день, Сэм, еще один быстрый вопрос. Я заметил, что в методе Query я могу передать до 5 объектов, используя одну из перегрузок метода. Можно ли использовать этот метод для создания того, что я пытаюсь здесь сделать, или я неправильно понимаю его использование?   -  person mreyeros    schedule 31.08.2011


Ответы (1)


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

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

person Omnia9    schedule 04.09.2011
comment
Отличный Arnej65, это определенно мне очень поможет. - person mreyeros; 06.09.2011
comment
Возможно ли это также, когда запрос находится в хранимой процедуре (поэтому вы в основном вызываете аргументы передачи хранимой процедуры)? - person Krzysztof Branicki; 18.05.2016
comment
@KrzysztofBranicki Да. В моем случае у меня были хранимые процедуры, которые запрашивали все необходимые данные и возвращали простой вывод. - person Omnia9; 18.05.2016