根据动态变量的索引读取列名

时间:2017-06-28 04:58:25

标签: c# .net dynamic dapper

我有一个sproc,它根据给定的输入参数返回具有不同列名的可变数量的列。 (以及行数> = 1)

例如,如果输入为3,则sproc返回3列,如果输入为5,则返回5.(不确定输入参数可能给出)

我正在使用dapper将我的sproc集成到C#应用程序中,我使用dynamic作为返回类型,如下所示。

dynamic returnValue = connection.Query<dynamic>("sproc and inputs")

有人可以指导我如何从动态变量中读取列吗?

使用returnValue[0].col1, returnValue[0].col2有效,但我不确定要查询的列数。

有没有办法读取像returnValue[0]["c1"]这样的列或任何更简单的方法,以便我可以循环以根据输入参数获取所有列?

1 个答案:

答案 0 :(得分:1)

调用connection.Query()的结果可以转换为IEnumerable<IDictionary<string, object>>,这将允许您迭代结果或使用索引和列名称键访问它们。例如:

IEnumerable<IDictionary<string, object>> results;

string sql = @"select 'a' as col1, 'b' as col2, 'c' as col3, 'd' as col4
               union
               select 'w' as col1, 'x' as col2, 'y' as col3, 'z' as col4";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    results = connection.Query(sql) as IEnumerable<IDictionary<string, object>>;
}

//we need to use ElementAt as we have an Enumerable but we could ToList it if required
Console.WriteLine(results.ElementAt(0)["col1"]);

//we can iterate the rows
foreach (var row in results)
{
    //then iterate the columns and get a KeyValuePair for each column
    foreach (var col in row)
    {
        Console.WriteLine("{0} {1}", col.Key, col.Value);
    }
}

打印哪些:

  

一个
  col1 a   col2 b
  col3 c
  col4 d
  col1 w
  col2 x
  col3 y
  col4 z