Dapper - テーブル継承を使用する複数の結果セットのマッピング

dapper inheritance

質問

私はマップしようとしている次のクラス構造と一致するデータベース構造を持っています。私は、要素のリストを含むデザインクラスを持っています。要素には、テキスト、図形、イメージの3種類があります。私は、抽象クラスを使用して、シェイプと私のデータベース構造の間の共通のプロパティを維持します。

私のストアドプロシージャは、2つのレコードセットを返します.1つはデザインであり、もう1つはすべての要素です。要素レコードセットは、左の結合を使用して、すべての要素を非共通のプロパティとともに返します。各要素にはElementTyepIDがあり、要素のタイプを決定します。私のデザインクラスにはListが含まれています。その2番目の結果セットを取得し、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

エキスパート回答

この結合アプローチは、dapperが直接サポートするアプローチではありません。複数のジェネリック型の引数を受け入れるQuery<…> api(水平分割ごとに1つ)を使用し、最終的なセレクタを使用して正しいオブジェクトを構築することで、ある程度運が良かったかもしれません。あるいは、非ジェネリックAPIを使用して手動でカラムを引き出すこともできます(ただし、カラム名が重複すると問題が発生する可能性があります)。

しかし何かを自動化するためには、機能を検討し、設計し、特定し、実装し、テストし、サポートする必要があります。これらのことは、このシナリオではまだ起こっていません。


人気のある回答

すぐに使用できるマルチマップapiが動作しない理由はわかりません。あなたの要素型は共通のクラスから継承しないので、単純にそれらをすべてタプルで返す必要があります...次に、それらがヌルであるかどうかを評価し、それらで何をするかを決めることができます。

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

私はUser、Account、Locationオブジェクトであり、 'MessageRecipientType'によって区別される 'MessageRecipients'を持っている同様の状況にいました。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ