Usar constructores que toman objetos de tipo no primitivo de dapper

.net c# constructor dapper

Pregunta

Estoy usando dapper para leer objetos que se ven así:

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

El constructor de la clase objetivo toma múltiples parámetros de tipo no primitivo ValueOverride , que se define de la siguiente manera:

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

Estoy leyendo los datos de la siguiente manera:

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

Este código requiere mucha repetición, entonces me pregunto si hay un enfoque menos repetitivo.

Respuesta aceptada

Creo que el principal problema es que tienes muchas columnas que deseas manejar de la misma manera.

Yo recomendaría, si es posible, hacer lo siguiente:

  1. Desenvolve el lado de la base de datos de datos. Obtendrá una lista de columna (¿día?), Valor e indicador, no una fila con muchos valores. (Esto ya podría ser el caso en su modelo de datos real)
  2. Convierta cada valor y columna de marcador usando un Select .
  3. Pivote ( GroupBy ) esos datos juntos para regresar al formato original y al formato requerido de su clase.


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué