¿Puede el multimapping de Petapoco manejar múltiples JOINs?

dapper join mapping petapoco

Pregunta

Tengo una lista de objetos que utilizo para rellenar usando Petapoco.

Las propiedades de clase y los nombres están maquinando el esquema de la base de datos. La clase principal es Issue , y está relacionada con otras dos clases cuyos nombres y propiedades coinciden también con el esquema de la base de datos: Condition y SeverityLevel .

public class Issue
{
    public int Id { get; set; } // Primary key

    /* Some properties... */
    public DateTime? CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }

    /* ... */

    // Related source and target conditions
    [PetaPoco.Ignore]
    public Condition SourceCondition { get; set; }

    [PetaPoco.Ignore]
    public Condition TargetCondition { get; set; }

    // Related severity level
    [PetaPoco.Ignore]
    public SeverityLevel CurrentSeverityLevel { get; set; }
}

public class Condition
{
    public int Id { get; set; } // Primary Key
    public string Description  { get; set; }
}

public class SeverityLevel
{
    public int Id { get; set; } // Primary key
    public string Description { get; set; }
    public string HexColorDisplay { get; set; }
}

En realidad, cuando recupero una lista de Issues, estoy usando la característica de multimapping para recuperar la lista Issue y el SeverityLevel relacionado usando un solo comando:

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

Ahora, debido a que Petapoco parece no manejar múltiples UNIONES, necesito hacer un segundo paso para adjuntar SourceCondition y TargetCondition a cada Issue I recuperado.

Para hacerlo, podría:

  • adjunte la fuente y la condición de destino después de una lectura, en un bucle foreach,
  • o recuperar toda la lista de Condiciones, luego adjuntar a cada Issue usando el mismo tipo de for-each.

Por ahora, estoy usando la segunda solución porque hay un conjunto limitado de Condición en la base de datos.

De todos modos, me parece un poco pesado hacerlo de esta manera, ya que requiere casi tantas consultas como tablas agregadas.

Me pregunto si podría lograr hacer algo como esto:

var Results = Db.Fetch</* ????? */>(
    /* ???? */
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

Queridos usuarios de Petapoco, querido autor de Petapoco, ¿es esta una forma de manejar esto?

¿Podría usar Dapper para tramitar esto en su lugar (si puede ...), apparto, definitivamente quiero mantener Petapoco para mis operaciones de actualización / inserción?

Respuesta aceptada

Esto debería poder hacerse.

var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

No he probado esto. También estoy trabajando en una forma de automatizar esto.

Es realmente importante que las columnas seleccionadas estén en el mismo orden que los tipos de parámetros.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué