Tengo una tabla, pero me gustaría asignarla como una composición entre dos clases.
Supongamos que tengo una tabla de clientes con los siguientes campos: Id, Name, 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;}
}
¿Cuál es la mejor manera de consultarlo y rellenar ExtraData dentro del objeto Cliente?
Editar:
Extenderé la pregunta a un escenario más complejo, ya que la respuesta de XenoPuTtSs resuelve la primera, pero no funcionará con esta.
Supongamos ahora que tengo una tabla para unirme a la dirección. La opción splitOn dividirá el resultado para crear ExtraData pero no se dividirá para crear la dirección.
Veo otro problema al utilizar splitOn. No podemos usar Select * de forma segura porque si alteramos la tabla con más campos, siempre debemos recordar mover los campos divididos a la parte inferior. O siempre tendremos que describir todos los campos en orden de seguridad en el comando Seleccionar.
splitOn: "Id, ExtraDataValue, Id" Creo que esto responde a su versión más reciente de la pregunta. Ahora tiene una dirección de unión y completa la parte de dirección de su objeto de 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;
}
Solo estaba buscando esto por mí mismo. Esto es lo que se me ocurrió, cambiado a tu escenario.
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;
}