Dapper行(Dapper Row)的括号表示法结果(Dapper Results)

14
根据 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");

我希望能够做到以下几点: 1. 获取返回的字段名称和数据类型列表。 2. 使用字段名称进行迭代,并以以下方式获取数据:
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"]

调用该方法会返回类型为字符串的结果"This is the description"。

我发现results[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]的结果,并返回"Id"。
1个回答

34

您可以将每一行转换为一个 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);
    }
}

我该怎么做呢?问题在于我事先不知道键是什么,所以无法循环遍历行并将字段名称(例如Id、Description)转换为字典键,因为我只能通过result[0].Id或result[0].Description访问它。 - Andy
1
键和值都在结果中。但它们位于一个名为DapperTable的私有密封类中。值也是如此。 - Andy
非常好,这对我帮助很大。 - 3 rules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接