我可以从Dapper查询返回多个派生类型的集合

我有一个类似于这样的类结构:

public abstract class Device { public int DeviceId { get; set; } //Additional Properties } public class DeviceA : Device { //Specific Behaviour } public class DeviceB : Device { //Specific Behaviour } 

我需要检索设备列表,或者单个设备,它被实例化为适当的派生类型(基于数据库中设备记录中的类型值)。 也就是说, Device对象的集合应该包含许多具有不同类型的对象,所有这些对象都是从Device派生的。

我已经通过以下方式实现了这一点,但有些事情对此感觉不对。

 public static IEnumerable AllDevices() { using (var connection = CreateConnection()) { connection.Open(); return connection.Query("SELECT * FROM Device").Select(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; }); } } 

这是使用Dapper实现这一目标的正确方法,还是有更好的方法?

在当前构建中,这可能是唯一的选择(特别是因为基类型是抽象的)。 但是,想出建立有区别的inheritance制度的方法并不是不合理的。 到目前为止,我们所做的并不是因为它没有出现 – 但这听起来并非不可能。 我能看到的最大问题(显然除了IL争论之外)就是我们如何表达这种关系。

我想出了这个解决方案:

 using (IDbConnection db = new MySqlConnection(ConfigurationManager.ConnectionStrings["yourConnection"].ConnectionString)) { return db.Query(@" Select Discriminator, ... From Device", (d, da, db) => { if (p.Discriminator == "DeviceA") { return new DeviceA(); } else if (p.Discriminator == "DeviceB") { return new DeviceB(); } return d; }); 

听起来很棘手,但确实有效!

希望它可以帮到你。 }