Dapperクエリから複数の派生型のコレクションを返すことはできますか

c# dapper inheritance subclass

質問

私はこのようなクラス構造を持っています:

public abstract class Device
{
    public int DeviceId { get; set; }
    //Additional Properties
}

public class DeviceA : Device
{
    //Specific Behaviour
}

public class DeviceB : Device
{
    //Specific Behaviour
}

私は、デバイスのリスト、または適切な派生型としてインスタンス化された単一のデバイス(DB内のデバイスレコードのType値に基づいて)を取得する必要があります。つまり、 Deviceオブジェクトのコレクションには、タイプが異なる多数のオブジェクトが含まれている必要があります。これらのオブジェクトはすべてDeviceから派生しています。

私はこれを次のように実装しましたが、何かが正しく感じられません。

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;
            });
    }
}

これはDapperを使ってこれを達成する正しい方法ですか、それとも良い方法がありますか?

受け入れられた回答

現在のビルドではおそらく唯一のオプションです(特に基本型が抽象型であるため)。しかし、差別化された相続制度を提案する方法を考えるのは不合理ではない。これまでにやったことではありませんが、不可能ではありません。私が見ることができる最大の問題(明らかにIL-論争以外)は、単に我々がその関係を表現する方法です。


人気のある回答

私はこの解決策を思いついた:

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

トリッキーな音ですが、うまくいきます!

それがあなたを助けることを願っています。 }



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow