2013-07-19 13 views
13

ho una riga proveniente dal databaseDapper più oggetti da una riga

select "John" Name, 
     "Male" Gender, 
     20 Age, 
     "Rex" PetName, 
     "Male" PetGender, 
     5 PetAge 
     // ... many more ... 

Utilizzando Dapper, mi piacerebbe tirare questa riga in due oggetti:

class Person 
{ 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    public int Age { get; set; } 
    // ... many more ... 
}  
class Pet 
{ 
    public string PetName { get; set; } 
    public string PetGender { get; set; } 
    public int PetAge { get; set; } 
    // ... many more ... 
} 

Nota: non c'è nessuna relazione gerarchica qui, sto semplicemente cercando di mappare una riga del database in due (o più) oggetti.

Come posso farlo usando dapper?

  • So che posso farlo restituendo una dinamica e mappando manualmente ogni oggetto, che è doloroso come nel mio scenario abbiamo un gran numero di colonne. Preferirei non farlo. (E no, non può essere riprogettato per richiedere meno colonne.)

Quello che ho provato:

  • Ho guardato in QueryMultiple<Person,Pet>, ma assume sto facendo funzionare più query. Nel mio scenario di vita reale, questa è una query molto costosa e mi piacerebbe solo eseguirla una volta.
  • Ho anche cercato di restituire Query<Person,Pet,Tuple<Person,Pet>>, ma questo richiede una colonna Id, qui non esiste una relazione gerarchica o Id s. Voglio solo prendere una singola riga e mapparla a più colonne.

risposta

13

Eri molto vicino alla soluzione con il metodo Query. Se non si dispone di una colonna Id, allora si può fornire un argomento splitOn:

connection.Query<Person, Pet, Tuple<Person, Pet>>(sql, 
    (person, pet) => Tuple.Create(person, pet), splitOn: "PetName"); 
+0

mi sto perdendo qualcosa? Anche quando fornisco 'splitOn', ottengo ancora' ArgumentException: quando usi le API multi-mapping assicurati di impostare il parametro splitOn se hai chiavi diverse da Id. Nome parametro: splitOn' –

+0

è strano. potrebbe essere necessario mostrarci la query sql esatta e il codice. non è probabile ma forse il tuo campo SplitOn esiste anche nel primo tipo, e vuoi includerlo nel secondo tipo, per caso? –

+0

Hai ragione, quando lo uso con questo scenario giocattolo, funziona perfettamente. Dovrò scavare e capire dove le mie cose stanno andando male nel mio vero codice. –

Problemi correlati