Utiliser des constructeurs prenant des objets de type non primitif à partir de dapper

.net c# constructor dapper

Question

J'utilise Dapper pour lire des objets qui ressemblent à ceci:

class MonthlyData {
    public ValueOverride One {get;}
    public ValueOverride Two {get;}
    ...
    public ValueOverride Ten {get;}
    public MonthlyData(
        ValueOverride a
    ,   ValueOverride b
    ,   ...
    ,   ValueOverride j
    ) {
        One = a;
        Two = b;
        ...
        Ten = j;
    }
}

Le constructeur de la classe cible prend plusieurs paramètres de type non primitif ValueOverride , défini comme suit:

class ValueOverride {
    public decimal Val {get;}
    public bool IsOverride {get;}
    public ValueOverride(decimal v, bool flag) {
        Val = v;
        IsOverride = flag;
    }
}

Je lis les données comme suit:

var res = conn.Query<dynamic>(
    @"SELECT
          COALESCE(o.A, d.A) AS a
      ,   CAST( CASE WHEN o.A IS NOT NULL THEN 1 ELSE 0 END AS bit) AS aFlag
      ,   ...
      FROM MonthlyData d
      LEFT OUTER JOIN MonthlyOverride o
                   ON d.Month = o.Month"
).Select(r =>
    new MonthlyData(
        new ValueOverride(r.a, r.aFlag)
    ,   new ValueOverride(r.b, r.bFlag)
    ,   ...
    ,   new ValueOverride(r.j, r.jFlag)
    )
);

Ce code nécessite beaucoup de répétition, alors je me demande s'il y a une approche moins répétitive?

Réponse acceptée

Je pense que le principal problème est que vous avez beaucoup de colonnes que vous voulez gérer de la même manière.

Je recommanderais, si possible, de faire ce qui suit:

  1. Dévivez le côté de la base de données. Vous obtiendrez une liste de colonne (jour?), Valeur et indicateur, pas une ligne avec beaucoup de valeurs. (cela pourrait déjà être le cas dans votre vrai modèle de données)
  2. Convertir chaque valeur et marquer la colonne en utilisant un Select .
  3. GroupBy pivoter ( GroupBy ) les données ensemble pour revenir au format d'origine et au format requis de votre classe.



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