2013-04-19 3 views
13

에서 여러 파생 된 형식의 컬렉션을 반환 할 수 파생 형식 (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를 사용하여이를 달성하는 올바른 방법입니까 아니면 더 나은 방법이 있습니까?

+0

두 개의 별도 쿼리로 쿼리를 분할하면 더 읽기 쉽게 만들 수 있습니다. 하나는 DeviceType 1이고 다른 하나는 deviceType 2입니다. 그런 다음 두 가지 결과 세트를 결합하여 반환합니다. 그러나 그 외에는 좋은 해결책 인 것 같습니다. – DavidEdwards

+0

필자가 찾고있는 것은 아니며, 특히 단일 장치를 검색 할 때 유스 케이스의 경우, 미리 장치 유형을 알지 못하므로 특히 그렇습니다. (예 : 일련 번호 또는 다른 식별자로 기기 가져 오기). 고마워, 데이빗. – GaryJL

+0

이 기능의 진행 과정을 추적하고 싶다면 https://github.com/StackExchange/dapper-dot-net/issues/262 – ajbeaven

답변

3

현재 빌드에서 유일한 옵션입니다 (특히 기본 유형이 추상이므로). 그러나 차별 된 상속 시스템을 제안하는 방법을 생각하는 것은 무리가 아닙니다. 지금까지 우리가 한 일이 아닙니다. 단순히 일어나지 않았기 때문이며, 불가능하지 않습니다. 제가 볼 수있는 가장 큰 문제는 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; 
       });  

까다로운 소리, 그러나 그것은 작동합니까 :

+0

고마워, 마크. 기본 유형이 추상적이 아닌 경우의 차이점은 무엇입니까? – GaryJL

+0

@GaryJL 나는 추상을 언급하지 않았다. 현재는 선언 된 유형 (아마도 기본 유형)을 작성합니다. 만약에 더 "영리한"것이 계속된다면, 분명히 그 타입을 생성 할 필요가없는 한 추상적 인 기본 타입이 작동 할 것으로 기대할 것입니다. # –

+1

저는 이것이 이전에 나오지 않았다는 것에 놀랐습니다. 많은 데이터베이스에서 이와 같은 상속이 매우 일반적이라고 생각됩니다. – ajbeaven

0

나는이 솔루션을 내놓았다했습니다!

희망이 있으면 도움을 드리겠습니다. }

관련 문제