Dapper - Mappage de plusieurs jeux de résultats utilisant l'héritage de table

dapper inheritance

Question

J'ai la structure de classe suivante et la structure de base de données correspondante que j'essaie de mapper. J'ai une classe de conception qui contient une liste d'éléments. Il peut y avoir 3 types d'éléments différents: texte, forme et image. J'utilise une classe abstraite pour conserver les propriétés communes entre les formes et ma structure de base de données reflète celle-ci.

Ma procédure stockée retourne deux jeux d'enregistrements, l'un avec les dessins et l'autre avec tous les éléments. Le jeu d'enregistrements d'élément utilise les jointures de gauche pour renvoyer tous les éléments avec leurs propriétés non communes. Chaque élément a un ElementTyepID qui détermine quel type d'élément il est. Ma classe de conception contient une liste. Y a-t-il un moyen de prendre ce second jeu de résultats et de le faire correspondre à la sous-classe correcte d'Element basée sur 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

Réponse d'expert

Cette approche syndicale n’est pas celle que Dapper prend en charge directement. Vous pourriez avoir de la chance avec l'API Query<…> qui accepte plusieurs arguments de type générique - un par fractionnement horizontal - et utiliser le sélecteur final pour construire l'objet correct. Vous pouvez également utiliser l'API non générique et extraire les colonnes manuellement (même si vous avez des problèmes en cas de doublon de noms de colonne).

Mais pour quelque chose d’automatique, la fonctionnalité doit être considérée, conçue, spécifiée, implémentée, testée et prise en charge. Pour ce scénario, ces choses ne sont pas encore arrivées.


Réponse populaire

Je ne vois pas pourquoi l'API multimap prête à l'emploi ne fonctionnerait pas. Comme vos types d'éléments n'héritent d'aucune classe commune, vous devez simplement les renvoyer tous dans un tuple ... Vous pouvez ensuite évaluer s'ils sont nuls ou non et décider quoi en faire.

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

J'ai été dans une situation similaire où nous avons des 'MessageRecipients' qui peuvent être des objets User, Account, Location et sont différenciés par 'MessageRecipientType'.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi