c# - 有没有办法使用 Dapper 将每一行检索为 IDictionary<string, string> ?

标签 c# .net string dictionary dapper

我有一个这样的表结构:

Table tbUser

--ID (int)

--Name (varchar)

--Birthday (datetime)

--Rating (double)

什么时候

"SELECT * FROM tbUser"

我希望查询结果中的每一行看起来像(将每一列变成字符串格式):

row["ID"] = "1";
row["Name"] "John"
row["Birthday"] = "1980-01-01"
row["rating"] = "3.4"

我需要字符串作为结果的原因是它们易于操作/格式化/显示并且有时更安全(如果另一位工程师更改了数据库中的列类型——例如“评级”列从 double 更改为 int ,该程序不太可能抛出异常,因为它只关心字符串)

我知道有一种方法可以将 DapperRow 转换为 IDictionary<string, object> , 这非常接近 IDictionary<string, string> ;

var result = conn.Query("SELECT * FROM tbUser");
foreach (IDictionary<string, object> row in result) {
  // I have to write my own object->string conversion in every loop
}

非常感谢任何建议!

最佳答案

不,Dapper 不会为您做这件事(也不应该!)。首先 - 转换是在数据库中还是在代码中完成?事情是如何格式化的? (我们如何格式化 2,000.20?并非所有文化都使用 . 作为小数位,也不使用 , 作为千位分隔符。对于日期来说更糟)。

不过,你可以这样写:

var data = Connection.Query("SELECT TOP 100 * FROM People") 
                      as IEnumerable<IDictionary<string, object>>;

var outData = data.Select(r => r.ToDictionary(d => d.Key, d => d.Value?.ToString()));

或者您可以编写自己的扩展:

public static class DapperExtensions
{
    public static IEnumerable<IDictionary<string, string>> QueryDictionary(this IDbConnection connection, string query)
    {
        var data = Dapper.SqlMapper.Query(connection, query) as IEnumerable<IDictionary<string, object>>;
        return data.Select(r => r.ToDictionary(d => d.Key, d => d.Value?.ToString()));
    }
}

并这样使用它:

var data = Connection.QueryDictionary("SELECT TOP 100 * FROM People");

关于c# - 有没有办法使用 Dapper 将每一行检索为 IDictionary<string, string> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36994879/

相关文章:

c# - 运行 NxBRE 时无法定位 NUnit 目录

c# - 尝试在 C#.NET/WPF 中获取网页时如何处理 JavaScript?

c - 如何在 C 语言中找到字符串的平衡?

python - 使用 pandas 的 if 语句抛出 "ValueError: The truth value of a Series is ambiguous"

Python 字符串模式

c# - 一行中的两个布局

c# - Visual Studio 2010 检测探查器使用什么时间单位?

c# - 您是否缺少 using 指令或程序集引用?

c# - 序列化 List<T> 错误反射(reflect)字段

c# - 手动添加引用