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

时间:2016-05-03 02:59:57

标签: c# .net string dictionary dapper

我有一个像这样的表结构:

  

表tbUser

     

- ID(int)

     

- 名称(varchar)

     

- 生日(日期时间)

     

- 评级(双倍)

何时

"SELECT * FROM tbUser"

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

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

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

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

IDictionary<string, string>

任何建议都非常感谢!

2 个答案:

答案 0 :(得分:10)

不,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");

答案 1 :(得分:2)

这似乎已经得到了回答。

您需要创建一个模型/类,然后按照此代码段来实现您想要的效果;

Dictionary<string, SP> dictionary = connection.Query<SP>(@"
SELECT 
     routine_name AS RoutineName,
     created AS Created,
     modified AS Modified
FROM PROCEDURES
").ToDictionary(m => m.RoutineName, m => m);

请参阅此主题以获取完整答案 - How to put objects into a dictionary using Dapper in C#?