Dapper - 映射使用表继承的多个结果集

3
我有以下类结构和相应的数据库结构需要进行映射。我有一个设计类,其中包含元素列表。有三种不同类型的元素:文本、形状和图像。我使用抽象类来维护形状之间的共同属性,我的数据库结构与之相对应。
我的存储过程返回两个记录集,一个是设计,另一个是所有元素。元素记录集使用左连接返回所有元素及其非公共属性。每个元素都有一个ElementTypeID,确定它是哪种类型的元素。我的设计类包含一个List。是否有一种方法可以将第二个结果集映射到正确的Element子类,基于ElementTypeID?
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个回答

2
这种联合方法并不是dapper直接支持的。您可以尝试使用Query<...> api,该api接受多个通用类型参数 - 每个水平拆分一个 - 并使用最终选择器来构建正确的对象。或者,您可以使用非通用api并手动提取列(如果存在重复的列名,则可能会出现问题)。
但是,对于自动化的东西 - 这个功能需要被考虑、设计、指定、实现、测试和支持。对于这种情况,这些事情尚未发生。

0

我不明白为什么开箱即用的multimap 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");

我之前也遇到过类似的情况,我们有一个叫做“MessageRecipients”的东西,它可以是用户、账户、位置等对象,并且通过“MessageRecipientType”进行区分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接