根据Dapper文档,您可以使用以下代码从dapper获取动态列表:
var rows = connection.Query("select 1 A, 2 B union all select 3, 4");
((int)rows[0].A)
.IsEqualTo(1);
((int)rows[0].B)
.IsEqualTo(2);
((int)rows[1].A)
.IsEqualTo(3);
((int)rows[1].B)
.IsEqualTo(4);
如果您必须知道字段的字段名称和数据类型,那么动态的用途是什么。 如果我有:
var result = Db.Query("Select * from Data.Tables");
我希望能够做到以下几点: 获取返回的字段名称和数据类型的列表。
使用字段名称对其进行迭代,并通过以下方式获取数据:
result.Fields
["Id", "Description"]
result[0].values
[1, "This is the description"]
这会让我得到
result[0].["Id"].Value
将给出结果1并且类型为例如Int 32
result[0].["Id"].Type --- what datattype is the value returned
result[0].["Description"]
将给出结果"这是描述"并且将是字符串类型。
我看到有一个结果[0] .table,它有一个带有字段数组的dapperrow对象,还有一个result.values,它是一个带有值的对象[2],但它不能被访问。如果我将一个手表添加到钻取的列名称,我可以获得id。自动创建的手表是:
(new System.Collections.Generic.Mscorlib_CollectionDebugView<Dapper.SqlMapper.DapperRow>(result as System.Collections.Generic.List<Dapper.SqlMapper.DapperRow>)).Items[0].table.FieldNames[0] "Id" string
所以我应该能够得到result [0] .Items [0] .table.FieldNames [0]并得到&#34; Id&#34;回来。
请协助。
答案 0 :(得分:18)
您可以将每一行转换为IDictionary<string, object>
,这样可以提供对名称和值的访问权限。我们目前没有明确跟踪类型 - 我们根本不需要。如果这还不够,请考虑使用返回IDataReader
的dapper方法 - 这将提供对原始数据的访问,同时仍允许方便的调用/参数化语法。
例如:
var rows = ...
foreach(IDictionary<string, object> row in rows) {
Console.WriteLine("row:");
foreach(var pair in row) {
Console.WriteLine(" {0} = {1}", pair.Key, pair.Value);
}
}