Mapper plusieurs colonnes sur une propriété unique avec Dapper

c# dapper

Question

Je travaille avec une base de données légèrement inégale par endroits. Par exemple, il existe deux procédures stockées qui renvoient essentiellement la même structure de jeu de résultats, mais pour une raison quelconque, l'administrateur de base de données a nommé le premier champ différemment dans l'un et dans l'autre. Je ne veux pas créer deux modèles distincts pour encapsuler ces données.

Est-il possible pour moi de configurer Dapper pour mapper ces deux jeux de résultats au même objet?

Par exemple, sp_GetSomeDataByQtr renvoie un jeu de résultats tel que:

Qtr int,
Lines int,
Balance money

sp_GetSomeDataByMonth renvoie un jeu de résultats tel que:

Mo int,
Lines int,
Balance money

Je veux encapsuler ces deux dans un objet comme

public class MyData {
    public int Term { get; set; } //This would be Qtr OR Mo depending on which SP is called.
    public int Lines { get; set; }
    public decimal Balance { get; set; }
}

Alors, avec Dapper:

MyData data = connection.Query<MyData>("sp_GetSomeDataByQtr", ...).FirstOrDefault();

ou:

MyData data = connection.Query<MyData>("sp_GetSomeDataByMonth", ...).FirstOrDefault();

Nous ne pouvons pas modifier directement les procédures stockées car il existe également des applications héritées qui récupèrent des données et qui dépendent de ces noms de colonne.

Est-il possible de faire cela avec Dapper? Je sais que vous pouvez configurer des mappes de type personnalisé, mais je ne sais pas comment procéder lorsque vous tentez de mapper plusieurs noms de colonnes sur une seule propriété d'un objet.

Réponse acceptée

Qu'en est-il de quelque chose comme ci-dessous? Dapper remplira Mo ou Lines en fonction de la procédure stockée, mais vous pouvez toujours lire la valeur de la propriété Term.

public class MyData
{
    public int? Mo { get; set; }
    public int? Lines { get; set; }
    public decimal Balance { get; set; }

    public int Term
    {
        get
        {
            if (Mo == null && Lines != null)
            {
                return Lines.Value;
            }
            if (Mo != null && Lines == null)
            {
                return Mo.Value;
            }

            return default(int);
        }
    }
}


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