2013-10-06 1 views
3

다음 클래스 구조와 일치하는 데이터베이스 구조가 있습니다. 요소 목록이 포함 된 디자인 클래스가 있습니다. 텍스트, 모양 및 이미지라는 세 가지 유형의 요소가있을 수 있습니다. 나는 추상 클래스를 사용하여 셰이프와 데이터베이스 구조 사이의 공통 속성을 유지합니다.Dapper - 테이블 상속을 사용하는 다중 결과 집합 매핑

내 저장 프로 시저는 디자인이있는 레코드 세트와 모든 요소가있는 레코드 세트를 반환합니다. 요소 레코드 집합은 왼쪽 조인을 사용하여 비표준 속성과 함께 모든 요소를 ​​반환합니다. 각 요소에는 요소의 유형을 결정하는 ElementTyepID가 있습니다. 디자인 클래스에 List가 포함되어 있습니다. 두 번째 결과 집합을 가져 와서 ElementTypeID를 기반으로 Element의 올바른 하위 클래스에 매핑하는 방법이 있습니까?

public class Design 
{ 
    public int DesignID {get;set;} 
    public string DesignName {get;set;} 
    public List<Element> ElementList {get;set;} 
} 

public class Element 
{ 
    public int ElementID {get;set;} 
    public int DesignID {get;set;} 
    public int ElementTypeID {get;set;} 
    public int Width {get;set;} 
    public int Height {get;set;} 
    public string Color {get;set;} 
} 

public class ElementText 
{ 
    public int ElementTextID {get;set;} 
    public int ElementID {get;set;} 
    public string Font {get;set;} 
    public string TextValue {get;set;} 
} 

public class ElementShape 
{ 
    public int ElementShapeID {get;set;} 
    public int ElementID {get;set;} 
    public int ShapeType {get;set;} 
} 

public class ElementImage 
{ 
    public int ElementImageID int {get;set;} 
    public int ElementID {get;set;} 
    public string ImageURL {get;set;} 
} 




Table: Design 
------------- 
DesignID int 
DesignName varchar(50) 


Table: Element 
-------------- 
ElementID int 
DesignID int 
ElementTypeID int 0-Text, 1-Shape, 2-Image 
Width int 
Height int 
Color varchar(10) 


Table: ElementText 
------------------ 
ElementTextID int 
ElementID int 
Font varchar(50) 
TextValue varchar(50) 



Table: ElementShape 
------------------- 
ElementShapeID int 
ElementID int 
ShapeType int 



Table: ElementImage 
------------------- 
ElementImageID int 
ElementID int 
ImageURL varchar(255) 



Create Table #Designs 
(
    [DesignID] [int] NOT NULL, 
    [DesignName] [varchar](50) NOT NULL, 
) 

-- Place all designs into a temp table 
Insert Into #Designs 
Select DesignID, DesignName from Design 

-- Return 1st Result Set (Designs) 
select * from #Designs 

-- Return 2nd Result Set (Elements) 
select * from Element as e 
left Join ElementText as t on e.ElementID=t.ElementID 
left Join ElementShape as s on e.ElementID=s.ElementID 
left Join ElementImage as c on e.ElementID=c.ElementID 
Where e.DesignID in (Select DesignID from #Designs) 
Order By e.ElementID ASC 

답변

2

이 조합 접근법은 dapper가 직접 지원하는 접근법이 아닙니다. Query<…> api에서 여러 개의 일반 유형 인수 (가로 분할 당 하나)를 허용하고 최종 선택기를 사용하여 올바른 객체를 작성하는 것이 좋습니다. 또는 비 제네릭 API를 사용하여 수동으로 열을 추출 할 수도 있습니다 (중복 된 열 이름이있는 경우 문제가 발생할 수 있음).

그러나 자동 기능의 경우 - 기능을 고려, 설계, 지정, 구현, 테스트 및 지원해야합니다. 이러한 상황은 아직까지도 발생하지 않았습니다.

0

기본 멀티 맵 API가 작동하지 않는 이유는 알 수 없습니다. 요소 유형은 공통 클래스에서 상속되지 않으므로 모든 클래스를 하나의 튜플로 반환해야합니다 ... 이후에 해당 요소가 null인지 여부를 평가하고 해당 클래스를 사용하여 수행 할 작업을 결정할 수 있습니다.

Query<Element,ElementText,ElementShape,ElementDesign,Tuple<Element,ElementText,ElementShape,ElementDesign>>(<sql>, 
(e,et,es,ed)=>{return Tuple.Create(e,et,es,ed)}, spliton:"ElementID,ElementTextID,ElementShapeID,ElementDesignID"); 

나는 우리가 사용자, 계정, 위치의 객체가 될 수 있고 'MessageRecipientType'에 의해 구분됩니다 'MessageRecipients'를 가지고 비슷한 상황에있었습니다.

관련 문제