Dapper Correct Object / Aggregate Mapping

dapper

Question

J'ai récemment commencé à évaluer Dapper en tant que solution de remplacement potentielle pour EF, car je n'étais pas très satisfait du code SQL généré et souhaitait avoir plus de contrôle sur celui-ci. J'ai une question concernant le mappage d'un objet complexe dans mon modèle de domaine. Disons que j'ai un objet appelé Provider, Provider peut contenir plusieurs propriétés de type IEnumerable qui ne doivent être accessibles qu'en parcourant l'objet fournisseur parent (racine agrégée). J'ai vu des messages similaires expliqués à l'aide de la méthode d'extension QueryMultiple et d'une méthode d'extension Map, mais je me demandais si je voulais écrire une méthode qui ramènerait l'intégralité du graphe d'objet chargé, si Dapper pouvait le faire d'un seul coup. ou si cela devait être fait à la pièce. Par exemple, disons que mon objet ressemblait à ceci:

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

Existe-t-il un moyen simple de remplir le graphe d'objet entier à l'aide de Dapper?

Réponse acceptée

J'ai une situation similaire J'ai rendu mon sql à plat, de sorte que tous les sous-objets reviennent. Ensuite, j'utilise la requête <> pour mapper l'ensemble complet. Je ne suis pas sûr de la taille de vos sets.

Donc quelque chose comme ça:

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

Le dernier objet de la balise Query est donc l'objet retour. Pour le SplitOn , vous devez considérer le retour comme un tableau plat sur lequel le mappage sera exécuté. Vous choisirez la première valeur de retour pour chaque nouvel objet afin que le nouveau mappage commence ici.

Exemple:

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

Le spliton serait "ID, fooid, BarName, foobarid". En parcourant l'ensemble de retour, il va mapper les propriétés qu'il peut trouver dans chaque objet.

J'espère que cela vous aidera, et que votre retour n'est pas trop important pour revenir à plat.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi