Kann das Multi-Mapping von Petapoco mehrere JOINs verarbeiten?

dapper join mapping petapoco

Frage

Ich habe eine Liste Objekte, die ich benutze, um mit Petapoco zu füllen.

Die Klasseneigenschaften und Namen bearbeiten das Datenbankschema. Die Hauptklasse ist Issue und bezieht sich auf zwei andere Klassen, deren Namen und Eigenschaften ebenfalls mit dem Datenbankschema übereinstimmen: Condition und 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; }
}

Eigentlich , wenn ich eine Liste von Themen abrufen, ich bin mit dem multimapping Feature Ausgabe Liste abzurufen und die dazugehörigen SeverityLevel einen einzigen Befehl:

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

Da Petapoco anscheinend nicht mehrere JOINS behandelt, muss ich einen zweiten Schritt machen, um SourceCondition und TargetCondition an jedes von mir abgerufene Problem anzuhängen .

Um das zu tun, könnte ich entweder:

  • Fügen Sie die Quelle und die Zielbedingung nach einem Lesen in einer foreach-Schleife an,
  • oder rufen Sie die gesamte Liste der Bedingung ab, und hängen Sie sie dann an jedes Problem an, indem Sie dieselbe Art von for-each verwenden.

Fürs Erste verwende ich die zweite Lösung, da in der Datenbank eine begrenzte Anzahl von Bedingungen vorhanden ist.

Wie auch immer, es klingt ein bisschen schwer für mich, weil es fast so viele Abfragen erfordert, wie JOINED-Tabellen hinzugefügt werden.

Ich frage mich, ob ich etwas erreichen könnte, um so etwas zu machen:

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

Liebe Petapoco-Nutzer, lieber Petapoco-Autor, ist das ein Weg, damit umzugehen?

Könnte ich stattdessen Dapper verwenden, um damit umzugehen (wenn es möglich ist ...), möchte ich unbedingt Petapoco für meine Aktualisierungs- / Einfügevorgänge behalten?

Akzeptierte Antwort

Dies sollte möglich sein.

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

Ich habe das nicht getestet. Ich arbeite auch an einer Möglichkeit, dies zu automatisieren.

Es ist wirklich wichtig, dass die ausgewählten Spalten in der gleichen Reihenfolge wie die Parametertypen sind.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum