Dapper Correct Object / Aggregate Mapping

dapper

Pregunta

Recientemente comencé a evaluar a Dapper como posible sustituto de EF, ya que no estaba muy satisfecho con el SQL que se estaba generando y quería tener más control sobre él. Tengo una pregunta sobre el mapeo de un objeto complejo en mi modelo de dominio. Digamos que tengo un objeto llamado Proveedor, el Proveedor puede contener varias propiedades de tipo IEnumerable a las que solo se debe acceder yendo a través del objeto proveedor principal (es decir, la raíz agregada). He visto publicaciones similares que explicaron utilizando el método de extensión QueryMultiple y un método de extensión de mapa, pero me preguntaba cómo si quisiera escribir un método que devuelva todo el gráfico de objetos ansiosamente cargado, si Dapper pudiera hacerlo de una sola vez o si era necesario hacerlo por partes. Como ejemplo digamos que mi objeto se veía como el siguiente:

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

¿Hay una manera directa de poblar todo el gráfico de objetos usando Dapper?

Respuesta aceptada

Tengo una situación similar. Hice mi retorno sql plano, para que regresen todos los sub objetos. Luego uso la consulta <> para mapear el conjunto completo. No estoy seguro de lo grande que son tus sets.

Entonces algo como esto:

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

Entonces, el último objeto en la etiqueta de consulta es el objeto de devolución. Para SplitOn , debes pensar en el retorno como una matriz plana a través de la cual se ejecutará la asignación. Escogería el primer valor de retorno para cada nuevo objeto para que el nuevo mapeo comenzara allí.

ejemplo:

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

El splitón sería "ID, fooid, BarName, foobarid". A medida que se ejecutó en el conjunto de resultados, asignará las propiedades que puede encontrar en cada objeto.

Espero que esto ayude, y que su conjunto de devolución no sea demasiado grande como para regresar sin problemas.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow