Dapper Correct Object / Aggregate Mapping

dapper

Domanda

Di recente ho iniziato a valutare Dapper come potenziale sostituto di EF, dal momento che non ero troppo soddisfatto dell'SQL che veniva generato e volevo un maggiore controllo su di esso. Ho una domanda riguardante la mappatura di un oggetto complesso nel mio modello di dominio. Diciamo che ho un oggetto chiamato Provider, Provider può contenere diverse proprietà di tipo IEnumerable a cui si deve accedere solo passando attraverso l'oggetto del provider padre (cioè radice aggregata). Ho visto post simili che hanno spiegato l'utilizzo del metodo di estensione QueryMultiple e Map ma mi chiedevo come avrei voluto scrivere un metodo che avrebbe riportato indietro l'intero grafo degli oggetti caricato, se Dapper sarebbe stato in grado di farlo in un colpo solo o se doveva essere fatto pezzo-pasto. Ad esempio, diciamo che il mio oggetto ha un aspetto simile al seguente:

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

C'è un modo semplice per popolare l'intero grafico degli oggetti usando Dapper?

Risposta accettata

Ho una situazione simile. Ho reso il mio sql return flat, in modo che tutti gli oggetti secondari ritornino. Quindi utilizzo la query <> per mappare l'intero set. Non sono sicuro di quanto siano grandi i tuoi set.

Quindi qualcosa del genere:

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

Quindi l'ultimo oggetto nel tag Query è l'oggetto di ritorno. Per SplitOn , devi pensare al ritorno come una matrice piatta che verrà comunque eseguita. Sceglieresti il ​​primo valore di ritorno per ogni nuovo oggetto in modo che la nuova mappatura iniziasse lì.

esempio:

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

Lo spliton sarebbe "ID, fooid, BarName, foobarid". Mentre scorreva sul set di ritorno, mapperà le proprietà che può trovare in ogni oggetto.

Spero che questo aiuti e che il tuo set di ritorno non sia troppo grande per tornare piatto.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché