有没有办法使用 Dapper 将每一行检索为 IDictionary<string, string>?
Is there a way retrieve each row as IDictionary<string, string> using Dapper?
我有这样的 table 结构:
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"
我需要字符串作为结果的原因是它们很容易 manipulate/format/display 而且有时更安全(如果另一位工程师更改了数据库中的列类型——例如,“评级”列从 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
}
非常感谢任何建议!
这个好像已经有人回答了。
您需要创建一个模型/class,然后按照此代码片段实现您想要的;
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);
查看此主题以获得完整答案 -
不,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");
我有这样的 table 结构:
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"
我需要字符串作为结果的原因是它们很容易 manipulate/format/display 而且有时更安全(如果另一位工程师更改了数据库中的列类型——例如,“评级”列从 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
}
非常感谢任何建议!
这个好像已经有人回答了。
您需要创建一个模型/class,然后按照此代码片段实现您想要的;
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);
查看此主题以获得完整答案 -
不,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");