Dapper e sottoclassi

dapper

Domanda

Sto lavorando con un modello di dati EF esistente che include oggetti sottoclassi. Funziona bene quando si lavora con singoli oggetti, ma è piuttosto lento quando si carica un numero elevato di oggetti per l'analisi.

Ho iniziato ad esplorare Dapper come alternativa per il popolamento degli oggetti POCO utilizzati per l'analisi di sola lettura.

Il problema è che non riesco a vedere alcun modo per gestire correttamente una gerarchia di oggetti.

Se ho

class MyBase
{
}

class MyDerived1 : MyBase
{
}

class MyDerived2 : MyBase
{
}

Dapper popola correttamente un elenco di MyBase

var mine = conn.Query<MyBase>("SELECT * from MyTable");

La capacità di Multimap non sembra risolvere il problema (o mi sto perdendo qualcosa?).

C'è un modo per risolvere questo, a meno di fare un viaggio di andata e ritorno nel database per ogni sottoclasse?

Risposta accettata

 public class MyBase
    {
        public String BaseProp { get; set; }
    }

    public class MyDerived1 : MyBase
    {
        public String Derived1Prop { get; set; }
    }

    public class MyDerived2 : MyBase
    {
        public String Derived2Prop { get; set; }
    }

La multimapping o una mappatura dinamica dovrebbero fare il trucco.

MM:

String query = "SELECT * FROM Table";

var res = conn.Query<MyBase, MyDerived1, MyDerived2, Tuple<MyBase, MyDerived1, MyDerived2>>(query, (b, d1, d2) => Tuple.Create(b, d1, d2), splitOn: "Derived1Id,Derived2Id");

inserisci la descrizione dell'immagine qui

La mappatura dinamica è anche molto interessante e probabilmente più flessibile nel tuo caso (Grazie @Sam!)

var res = conn.Query<dynamic>(query).Select(x => new Tuple<MyBase, MyDerived1, MyDerived2>(new MyBase() { BaseProp = x.BaseProp },
                                                                                                           new MyDerived1() { Derived1Prop = x.Derived1Prop },
                                                                                                           new MyDerived2() { Derived2Prop = x.Derived2Prop }));


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é