c# - 使用构造函数从 dapper 获取非原始类型的对象

标签 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. 取消数据数据库侧透视。您将得到一个列(日?)、值和标志的列表,而不是包含大量值的行。 (在您的真实数据模型中可能已经是这种情况)
  2. 使用Select转换每个值和标志列。
  3. 对数据进行透视 (GroupBy),以返回原始格式和类所需的格式。

关于c# - 使用构造函数从 dapper 获取非原始类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34135985/

相关文章:

c# - 在 C# 中创建简单的分层 PSD 文件

java - 日历构造函数 Java toString

c# - 二维游戏物理资源

c# - 如何在 Xamarin.Forms 中将参数从一个页面传递到另一个页面?

c# - 使用包含 EF 时可能的 SQL 注入(inject)?

c# - VS2008 调试器是否保留超出范围的对象?

javascript - 什么时候需要使用 Object.assign() 方法来复制对象的实例?

c# - 为什么构造函数不接受可访问性较低的类的参数?

c# - 如何对派生自基类的类隐藏作为基类中接口(interface)实现的一部分的方法?

c# - 安装的 Dotnet 工具在 Ubuntu WSL2 上给出错误 "Could not execute because the specified command or file was not found."