Mam struktury klasowej podobny do tego:mogę wrócić zbiór wielu Derived ów Dapper zapytania
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
muszę pobrać listę urządzeń lub pojedynczego urządzenia, które jest tworzony jako właściwy typ pochodny (w oparciu o wartość typu w rekordzie urządzenia w bazie danych). Oznacza to, że zbiór obiektów Device
powinien zawierać wiele obiektów o różnych typach, z których wszystkie pochodzą od Device
.
Wdrożyłem to w następujący sposób, ale coś po prostu nie jest w porządku z tym.
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;
});
}
}
Czy jest to właściwy sposób osiągnięcia tego przy pomocy narzędzia Dapper, czy też istnieje lepsze podejście?
Może być bardziej czytelny, jeśli podzielisz zapytanie na 2 osobne zapytania. Jeden z DeviceType 1 i jeden dla deviceType 2, po czym połączył dwa zestawy wyników dla twojego powrotu, ale poza tym wydaje się to dobrym rozwiązaniem. – DavidEdwards
Niezupełnie tego, czego szukam - szczególnie w przypadku użycia podczas pobierania pojedynczego urządzenia, ponieważ nie znamy typu urządzenia z wyprzedzeniem. (Pobierz urządzenie według numeru seryjnego lub innego identyfikatora). Dzięki, David. – GaryJL
Jeśli chcesz śledzić postępy w tej funkcji: https://github.com/StackExchange/dapper-dot-net/issues/262 – ajbeaven