Tôi có một cấu trúc lớp tương tự như sau:Tôi có thể trả về một bộ sưu tập của nhiều loại nguồn gốc từ truy vấn Dapper
public abstract class Device
{
public int DeviceId { get; set; }
//Additional Properties
}
public class DeviceA : Device
{
//Specific Behaviour
}
public class DeviceB : Device
{
//Specific Behaviour
}
tôi cần phải lấy một danh sách các thiết bị, hoặc một thiết bị duy nhất mà được khởi tạo là phù hợp loại có nguồn gốc (dựa trên giá trị Type trong Record Device trong DB). Tức là, bộ sưu tập của các đối tượng Device
phải chứa một số đối tượng có các loại khác nhau, tất cả đều có nguồn gốc từ Device
.
Tôi đã thực hiện điều này theo cách sau, nhưng có điều gì đó không cảm thấy đúng về nó.
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;
});
}
}
Đây có phải là cách chính xác để đạt được điều này bằng Dapper hoặc có cách tiếp cận tốt hơn không?
Có thể dễ đọc hơn nếu bạn chia truy vấn thành 2 truy vấn riêng biệt. Một trong DeviceType 1 và một cho deviceType 2, sau đó kết hợp hai tập kết quả cho sự trở lại của bạn, nhưng khác hơn, điều này có vẻ là một giải pháp tốt. – DavidEdwards
Không thực sự những gì tôi đang tìm kiếm - đặc biệt đối với trường hợp sử dụng khi truy xuất một thiết bị duy nhất, vì chúng tôi không biết loại thiết bị trước thời hạn. (ví dụ: Nhận thiết bị theo số sê-ri hoặc một số số nhận dạng khác). Cảm ơn, mặc dù, David. – GaryJL
Nếu bạn quan tâm đến việc theo dõi tiến trình trên tính năng này: https://github.com/StackExchange/dapper-dot-net/issues/262 – ajbeaven