使用Dapper将多个列映射到单个属性

时间:2014-09-25 14:37:47

标签: c# dapper

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

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

例如,sp_GetSomeDataByQtr返回如下结果集:

Qtr int,
Lines int,
Balance money

同时,sp_GetSomeDataByMonth返回结果集,如:

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

那么,然后与Dapper:

MyData data = connection.Query<MyData>("sp_GetSomeDataByQtr", ...).FirstOrDefault();

或:

MyData data = connection.Query<MyData>("sp_GetSomeDataByMonth", ...).FirstOrDefault();

我们无法直接更改存储过程,因为遗留应用程序也会从它们中检索数据,并且取决于这些列名称。

有没有办法用Dapper做到这一点?我知道您可以设置自定义类型映射,但我不确定在尝试将多个列名称映射到对象的单个属性时如何执行此操作。

1 个答案:

答案 0 :(得分:1)

下面的内容如何? Dapper将根据存储过程填充Mo或Lines,但您始终可以从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);
        }
    }
}