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

ine*_*tia 4 .net c# string dictionary dapper

我有这样的表结构:

表tbUser

--ID(int)

--Name(varchar)

- 生日(日期时间)

- 速度(双倍)

什么时候

"SELECT * FROM tbUser"
Run Code Online (Sandbox Code Playgroud)

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

row["ID"] = "1";
row["Name"] "John"
row["Birthday"] = "1980-01-01"
row["rating"] = "3.4"
Run Code Online (Sandbox Code Playgroud)

我需要字符串作为结果的原因是它们易于操作/格式化/显示并且有些时候更安全(如果另一位工程师在DB中更改了列类型 - "评级"列更改doubleint,则程序不太可能抛出异常,因为它只关心字符串)

我知道有一种方法可以将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
}
Run Code Online (Sandbox Code Playgroud)

任何建议都非常感谢!

Rob*_*Rob 11

不,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()));
Run Code Online (Sandbox Code Playgroud)

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

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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

var data = Connection.QueryDictionary("SELECT TOP 100 * FROM People");
Run Code Online (Sandbox Code Playgroud)