3

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

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

2 に答える 2

2

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

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

于 2013-10-06T07:35:34.373 に答える
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");

私は、User、Account、Location オブジェクトである可能性があり、「MessageRecipientType」によって区別される「MessageRecipients」がある同様の状況にありました。

于 2013-10-17T21:56:12.003 に答える