从动态获取属性值

时间:2014-08-19 21:15:25

标签: oracle11g dapper .net-4.5

我使用动态Dapper,因为要查询的表在运行时才知道,所以POCO类是不可能的。

我通过WebAPI返回Dapper的结果。为了节省带宽,我只需要从Dapper返回,而不是属性名称,例如:

{
    7,"2013-10-01T00:00:00",0,"AC",null,"ABC","SOMESTAGE"
},...

而不是:

{
TID: 7,
CHANGE_DT: "2013-10-01T00:00:00",
EFFECTIVE_APPTRANS: 0,
EFFECTIVE_APPTRANS_STATUS: "AC",
DEVICE: null,
PROCESS: "ABC",
STAGE: "SOMESTAGE"
},...

我在找出合理的方法时遇到了一些麻烦。我试过滥用Dapper的映射功能:

var tableData = Database.Query<dynamic, dynamic, dynamic>(connectInfo, someResource.sql,
    (x, y) =>
    {
        List<object> l = new List<object>();
        object o = x;

        foreach(var propertyName in o.GetType().GetProperties().Select(p => p.Name)) {
            object value = o.GetType().GetProperty(propertyName).GetValue(o, null);
            l.Add(value);
        }
        return l as dynamic;
    },
    new {implantId, pendingApptrans},
    splitOn: "the_last_column");

我也尝试让Dapper使用相同的基本代码返回List。

我的想法是我在map函数中提取属性值,因为它允许我在返回任何内容之前使用行,但是我得到空结果而没有错误:

[
    [ ], [ ], [ ], [ ], [ ], [ ], [ ]
]

此外,我不知道要拆分的任何列名称,这是映射功能所需要的。但是,即使我从测试查询中输入最后一个列名,结果也是一样的。

如何仅从Dapper的动态返回值返回值? 在Dapper调用后我是否需要求助于动态后处理?

1 个答案:

答案 0 :(得分:1)

对于那一组特定的要求,是的,你需要进行后期处理;例如,您可以转换为DapperRowIDictionary<string,object>。或者,您可以使用现在公开的IDataReader API。