C# 使用Dapper将多个列映射到单个属性
我使用的数据库在某些地方有点不一致。例如,有两个存储过程返回的结果集结构基本上完全相同,但无论出于何种原因,DBA在其中一个字段中对第一个字段的命名不同于另一个字段。我不想创建两个单独的模型来封装这些数据 我可以设置Dapper将这两个结果集映射到同一个对象吗 例如,C# 使用Dapper将多个列映射到单个属性,c#,dapper,C#,Dapper,我使用的数据库在某些地方有点不一致。例如,有两个存储过程返回的结果集结构基本上完全相同,但无论出于何种原因,DBA在其中一个字段中对第一个字段的命名不同于另一个字段。我不想创建两个单独的模型来封装这些数据 我可以设置Dapper将这两个结果集映射到同一个对象吗 例如,sp_GetSomeDataByQtr返回如下结果集: Qtr int, Lines int, Balance money Mo int, Lines int, Balance money 而,sp_GetSomeDataByM
sp_GetSomeDataByQtr
返回如下结果集:
Qtr int,
Lines int,
Balance money
Mo int,
Lines int,
Balance money
而,sp_GetSomeDataByMonth
返回如下结果集:
Qtr int,
Lines int,
Balance money
Mo int,
Lines int,
Balance money
我想将这两者封装到一个对象中,如
public class MyData {
public int Term { get; set; } //This would be Qtr OR Mo depending on which SP is called.
public int Lines { get; set; }
public decimal Balance { get; set; }
}
那么,用简洁的语言:
MyData data = connection.Query<MyData>("sp_GetSomeDataByQtr", ...).FirstOrDefault();
MyData data=connection.Query(“sp_GetSomeDataByQtr”,…).FirstOrDefault();
或:
MyData data=connection.Query(“sp_GetSomeDataByMonth”,…).FirstOrDefault();
我们不能直接更改存储过程,因为有些遗留应用程序也会从存储过程中检索数据,这取决于这些列名
有没有一种方法可以用整洁来做到这一点?我知道您可以设置自定义类型映射,但当尝试将多个列名映射到对象的单个属性时,我不确定如何进行设置。下面的内容如何?Dapper将根据存储过程填充Mo或行,但您始终可以从Term属性中读取值
public class MyData
{
public int? Mo { get; set; }
public int? Lines { get; set; }
public decimal Balance { get; set; }
public int Term
{
get
{
if (Mo == null && Lines != null)
{
return Lines.Value;
}
if (Mo != null && Lines == null)
{
return Mo.Value;
}
return default(int);
}
}
}
这看起来可以让我在短期内取得进展,但如果可能的话,我希望看到一个处理类型映射的解决方案。谢谢您知道Dapper是通过与列名匹配的反射查找属性,还是只查找字段?如果它与属性匹配,那么我可以创建两个仅用于设置
Term
值的setter属性。仍然不是理想的解决方案,因为它需要我更改POCO/DataContract。我使用此解决方案实现了Dapper的自定义类型映射器,但我认为它是一个开/关解决方案。我不确定您是否将ColumnName属性添加两次到同一个属性,但请尝试一下,看看它是如何工作的。我是在独立尝试将多个ColumnName属性作为同一属性后到达这里的。它不编译。这意味着对我来说,我不仅要把属性放在类的最上面——我更喜欢从db中完全抽象出来——而且我还要绑定到一个特定的映射。这意味着ColumnName映射器可能根本就不太好。