我使用动态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调用后我是否需要求助于动态后处理?
答案 0 :(得分:1)
对于那一组特定的要求,是的,你需要进行后期处理;例如,您可以转换为DapperRow
或IDictionary<string,object>
。或者,您可以使用现在公开的IDataReader
API。