带有括号表示法的精致结果(Dapper Row)

时间:2014-11-14 14:59:36

标签: dapper

根据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;回来。

请协助。

1 个答案:

答案 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);
    }
}