Dapper:如何从查询中读入Dictionary列表?

时间:2016-03-21 13:34:32

标签: c# sql dictionary dapper

Dapper提供了许多将数据映射到动态对象列表的方法。但是在某些情况下,我想将数据读入字典列表。

SQL可能如下所示:

"SELECT * FROM tb_User"

由于tb_User可能会在外部发生变化,我不知道哪些列会返回结果。所以我可以写一些像这样的代码:

var listOfDict = conn.QueryAsDictionary(sql);
foreach (var dict in listOfDict) {
    if (dict.Contains("anyColumn")) {
        // do right thing...
    }
}

是否有任何内置方法可供Dapper进行此转换?

3 个答案:

答案 0 :(得分:8)

您可以将每行转换为IDictionary:

    var row = (IDictionary<string, object>)conn.Query("select foo = 1, bar = 'bar'").First();

    Assert.That(row["foo"], Is.EqualTo(1));
    Assert.That(row["bar"], Is.EqualTo("bar"));

答案 1 :(得分:2)

您可以使用Cast中的System.Linq扩展方法

IEnumerable<IDictionary<string, object>> rows;
rows = connection.Query(sqlRequest).Cast<IDictionary<string, object>>();

foreach (var row in rows)
{
    var columnValue = row['columnName']; // returns the value of the column name
}

答案 2 :(得分:0)

您可以为查询分配别名,使其与 KeyValueKeyValuePair 属性匹配,然后使用 .ToDictionary 方法如下:

var dict = db.Query<KeyValuePair<string, int>>(@"
    SELECT COMMUNITY_TYPE As Key, COUNT(*) AS Value
    FROM SNCOMM.COMMUNITY
    GROUP BY COMMUNITY_TYPE")
    .ToDictionary(x => x.Key, x => x.Value);

现在您有一个 Dictionary<string, int>,无需任何手动转换。