Può la multimapping di Petapoco gestire più JOINs?

dapper join mapping petapoco

Domanda

Ho una lista di oggetti che uso per riempire usando Petapoco.

Le proprietà e i nomi delle classi stanno elaborando lo schema del database. La classe principale è Issue , ed è correlata ad altre due classi i cui nomi e proprietà corrispondono allo schema del database: Condition e 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; }
}

In realtà, quando posso recuperare un elenco dei problemi, io sto usando la funzione multimapping recuperare l'elenco di Emissione e relativi SeverityLevel utilizzando un unico 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);

Ora, dato che Petapoco non sembra gestire più JOIN, ho bisogno di fare un secondo passo per collegare SourceCondition e TargetCondition a ciascun problema che ho recuperato.

Per fare ciò, potevo:

  • collegare la fonte e la condizione di destinazione dopo una lettura, in un ciclo di foreach,
  • o recuperare l'intero elenco di condizioni, quindi allegare quindi a ciascun problema utilizzando lo stesso tipo di per-ciascuno.

Per ora, sto usando la seconda soluzione perché esiste un set limitato di condizioni nel database.

Ad ogni modo, sembra un po 'pesante per me fare così, perché richiede quasi altrettante interrogazioni da fare quando vengono aggiunte le tabelle JOINED.

Mi chiedo se potrei realizzare per fare qualcosa di simile a questo:

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

Cari utenti di Petapoco, caro autore di Petapoco, è un modo per gestire questo?

Potrei usare Dapper per occuparsi di questo invece (se può ...), appart Voglio assolutamente mantenere Petapoco per le mie operazioni di aggiornamento / inserimento?

Risposta accettata

Questo dovrebbe essere in grado di essere fatto.

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

Non ho provato questo. Sto anche lavorando su un modo per automatizzare questo.

È molto importante che le colonne selezionate siano nello stesso ordine dei tipi di parametri.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché