Le multimap de Petapoco peut-il gérer plusieurs jointures?

dapper join mapping petapoco

Question

J'ai une liste d'objets que j'utilise pour remplir Petapoco.

Les propriétés et les noms de classe usinent le schéma de base de données. La classe principale est Issue , et elle est liée à deux autres classes dont les noms et les propriétés correspondent également au schéma de base de données: Condition et 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 fait, lorsque je récupère une liste de problèmes, j'utilise la fonctionnalité de multimappage pour récupérer la liste des problèmes et le niveau de gravité associé à l'aide d'une seule commande:

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

Maintenant que Petapoco ne semble pas gérer plusieurs JOINS, je dois faire une deuxième étape pour attacher SourceCondition et TargetCondition à chaque problème que j'ai récupéré.

Pour ce faire, je pourrais soit:

  • attacher la source et la condition cible après une lecture, dans une boucle foreach,
  • ou récupérer toute la liste de condition, puis attacher ensuite à chaque problème en utilisant le même type de for-each.

Pour le moment, j'utilise la deuxième solution car il existe un ensemble limité de conditions dans la base de données.

Quoi qu’il en soit, cela me semble un peu lourd à faire de cette façon, car cela nécessite presque autant de requêtes que d’ajouter des tables JOINED.

Je me demande si je pourrais réaliser quelque chose comme ça:

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

Chers utilisateurs de Petapoco, cher auteur Petapoco, est-ce une façon de gérer cela?

Est-ce que je pourrais utiliser Dapper pour gérer cela à la place (si c'est possible ...), à part je veux absolument garder Petapoco pour mes opérations de mise à jour / insertion?

Réponse acceptée

Cela devrait pouvoir être fait.

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

Je n'ai pas testé cela. Je travaille également sur un moyen d'automatiser cela.

Il est très important que les colonnes sélectionnées soient dans le même ordre que les types de paramètres.




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