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

And*_*ndy 9 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);
Run Code Online (Sandbox Code Playgroud)

但是,如果您必须知道字段的字段名称和数据类型,那么动态的用途是什么.如果我有 :

var result = Db.Query("Select * from Data.Tables");
Run Code Online (Sandbox Code Playgroud)

我希望能够执行以下操作:获取返回的字段名称和数据类型的列表.

使用字段名称对其进行迭代,并通过以下方式获取数据:

result.Fields
["Id", "Description"]

result[0].values
[1, "This is the description"]
Run Code Online (Sandbox Code Playgroud)

这样可以让我得到

result[0].["Id"].Value
Run Code Online (Sandbox Code Playgroud)

这将给出结果1并且类型为例如Int 32

result[0].["Id"].Type --- what datattype is the value returned

result[0].["Description"]
Run Code Online (Sandbox Code Playgroud)

这将给出结果"这是描述",并且将是字符串类型.

我看到有一个结果[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
Run Code Online (Sandbox Code Playgroud)

所以我应该能够得到result [0] .Items [0] .table.FieldNames [0]并得到"Id".

请协助.

Mar*_*ell 21

您可以将每行转换为a IDictionary<string, object>,这应该提供对名称和值的访问.我们目前没有明确跟踪类型 - 我们根本不需要.如果这还不够,请考虑使用返回的dapper方法IDataReader- 这将提供对原始数据的访问,同时仍允许方便的调用/参数化语法.

例如:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)