Dapper:如何从查询中读取字典列表?

8
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是否有内置方法可以进行此转换?

为了更好地理解,您希望将单个行作为IDictionary<,>,其中key=columnName,value=columnValue? - Brad Christie
3个回答

11

你可以将每一行转换为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
我尝试查找有关将 dynamic 强制转换为 IDictionary 的文档,但没有找到任何信息。有人有参考资料吗? - Mugen

5
您可以使用来自System.Linq的Cast扩展方法。
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
}

0

您可以为查询分配别名,以便与 KeyValuePairKeyValue 属性匹配,然后像这样使用 .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>,无需手动转换。

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