Ho un tavolo ma mi piacerebbe mapparlo come una composizione tra due classi.
Supponiamo di avere una tabella Cliente con i seguenti campi: Id, Nome, ExtraDataValue, ExtraDataDate.
class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public DateTime Date {get;set;}
}
Qual è il modo migliore per interrogarlo e compilare ExtraData all'interno dell'oggetto Cliente?
Modificare:
Estenderò la domanda a uno scenario più complesso, poiché la risposta di XenoPuTss risolve il primo ma non funzionerà con questo.
Supponiamo ora di avere un join per la tabella degli indirizzi. L'opzione splitOn dividerà il risultato per creare ExtraData ma non riuscirà a dividere per creare l'indirizzo.
Vedo un altro problema con splitOn. Non possiamo usare Select * tranquillamente perché se alteriamo la tabella con più campi, dobbiamo sempre ricordare di spostare i campi divisi in basso. O dovremo sempre descrivere tutti i campi in ordine sicuro nel comando Seleziona.
splitOn: "Id, ExtraDataValue, Id" Credo che questo risponda alla tua nuova versione della domanda. Ora hai un join da indirizzare e popola la porzione di indirizzo del tuo oggetto cliente.
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
public Address Address{get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
class Address {
public string line1{get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Address, Customer>(@"
select
c.cust_num as Id,
c.cust_name as Name,
c.ex_data1 as Value,
c.ex_date as Date,
a.*
from Customer c
join Address a on c.addressid = a.addressid
",
(cust, extra, address) =>
{
cust.Extra = extra;
cust.Address = address;
return cust;
},
splitOn:"Id, Value, Id");
return t;
}
Stavo solo cercando questo. Questo è quello che mi è venuto in mente, cambiato nel tuo scenario.
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Customer>(@"
select
cust_num as Id,
cust_name as Name,
ex_data1 as Value,
ex_date as Date
from Customer
",
(cust, extra) =>
{
cust.Extra = extra;
return cust;
},
splitOn: "Value");
return t;
}