使用构造函数从dapper获取非基本类型的对象

时间:2015-12-07 14:31:02

标签: c# .net constructor dapper

我正在使用dapper来读取如下所示的对象:

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

目标类的构造函数采用非基本类型ValueOverride的多个参数,其定义如下:

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

我正在阅读如下数据:

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

这段代码需要大量重复,所以我想知道重复性较低的方法吗?

1 个答案:

答案 0 :(得分:2)

我认为主要的问题是你有很多列要以同样的方式处理。

如果可能,我建议您执行以下操作:

  1. 取消数据库侧的数据。您将获得列(日?),值和标志的列表,而不是具有大量值的行。 (这可能已经是您真实数据模型中的情况)
  2. 使用Select转换每个值和标记列。
  3. 将数据一起旋转(GroupBy)以返回原始格式和所需的班级格式。