C# 使用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

我使用的数据库在某些地方有点不一致。例如,有两个存储过程返回的结果集结构基本上完全相同,但无论出于何种原因,DBA在其中一个字段中对第一个字段的命名不同于另一个字段。我不想创建两个单独的模型来封装这些数据

我可以设置Dapper将这两个结果集映射到同一个对象吗

例如,
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映射器可能根本就不太好。