使用构造函数从 dapper 获取非原始类型的对象
Using constructors taking objects of non-primitive type from 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;
}
}
目标class的构造函数接受多个非原始类型的参数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)
)
);
这段代码需要大量的重复,所以我想知道是否有一种重复较少的方法?
我认为主要问题是您有很多列要以相同的方式处理。
如果可能的话,我建议您执行以下操作:
- 反透视数据数据库端。您将获得列(天?)、值和标志的列表,而不是包含很多值的行。 (在您的真实数据模型中可能已经是这种情况)
- 使用
Select
. 转换每个值和标志列
- 将数据一起旋转 (
GroupBy
) return 为原始格式和 class 所需的格式。
我正在使用 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;
}
}
目标class的构造函数接受多个非原始类型的参数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)
)
);
这段代码需要大量的重复,所以我想知道是否有一种重复较少的方法?
我认为主要问题是您有很多列要以相同的方式处理。
如果可能的话,我建议您执行以下操作:
- 反透视数据数据库端。您将获得列(天?)、值和标志的列表,而不是包含很多值的行。 (在您的真实数据模型中可能已经是这种情况)
- 使用
Select
. 转换每个值和标志列
- 将数据一起旋转 (
GroupBy
) return 为原始格式和 class 所需的格式。