ho una struttura di classe simile a questo:Posso restituire un insieme di molteplici tipi derivati da Query Dapper
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
Ho bisogno di recuperare un elenco di dispositivi, o di un singolo dispositivo che viene istanziato come l'appropriato tipo derivato (basato su un valore Type nel Device Record nel DB). Cioè, la collezione di oggetti Device
dovrebbe contenere un numero di oggetti con tipi diversi, tutti derivati da Device
.
Ho implementato questo modo nel modo seguente, ma qualcosa non mi sembra giusto.
public static IEnumerable<Device> AllDevices()
{
using (var connection = CreateConnection())
{
connection.Open();
return connection.Query<dynamic>("SELECT * FROM Device").Select<dynamic, Device>(d =>
{
Device device = null;
if (d.DeviceTypeID == 1)
device = new DeviceA();
else if (d.DeviceTypeID == 2)
device = new DeviceB();
else throw new Exception("Unknown Device");
device.DeviceId = d.DeviceID;
return device;
});
}
}
È questo il modo corretto per ottenere ciò utilizzando Dapper oppure esiste un approccio migliore?
Potrebbe essere reso più leggibile se si divide la query in 2 query separate. Uno di DeviceType 1 e uno per deviceType 2, quindi combinato i due set di risultati per il tuo ritorno, ma a parte questo, questa sembra essere una buona soluzione. – DavidEdwards
Non proprio quello che sto cercando - in particolare per il caso d'uso quando si recupera un singolo dispositivo, dato che non conosciamo il tipo di dispositivo in anticipo. (Ad esempio, Ottieni dispositivo per numero di serie o qualche altro identificatore). Grazie, però, David. – GaryJL
Se sei interessato a monitorare i progressi su questa funzione: https://github.com/StackExchange/dapper-dot-net/issues/262 – ajbeaven