Правильное сопоставление объектов / совокупности карт Dapper

dapper

Вопрос

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

Принятый ответ

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

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему