Dapper 쿼리에서 여러 Derived Types 컬렉션을 반환 할 수 있습니까?

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의 장치 레코드에있는 형식 값에 따라)으로 인스턴스화 된 단일 장치를 검색해야합니다. 즉, 수집 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-wrangling을 제외하고는 분명히 우리가 관계를 어떻게 표현하고 있는지입니다.


인기 답변

나는이 해결책을 생각해 냈다 :

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
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.