【发布时间】:2019-04-10 08:04:49
【问题描述】:
问题
作为 Dapper Query 的结果,我们有一个 Dapper Row,我想将它作为 json 字符串存储在我们的数据库中。不幸的是,我似乎无法让它发挥作用。 那么,让我们从一些背景信息开始吧。
背景信息
我们正在做一个项目,我们从表中提取表名称,以了解我们必须处理哪些表。我们还希望它尽可能灵活,因此我们决定不对我们的数据使用特定的 POCO。
我们使用的是 SQL Server 2014,所以很遗憾我们还没有“FOR JSON”选项。
代码
我们的代码看起来像这样,其中 GetData 是我们的实际查询:
var data = _queryHandler.Handle(new GetData(tableName.ToString(), 0), database);
从技术上讲,句柄只是连接到数据库,调用
conn.QueryAsync(query, parameters)
GetData 看起来像这样(简化):
EXEC ('SELECT * FROM ' + @table + ')'
推理
因为表名每次都不同,我们不想在输出上强制使用 POCO。有时它是一个用户,有时是一个角色,可以这么说,所以无法预测它返回什么输出。
结果
这很好用。我们可以提取变量中的数据,这看起来像是一个 IEnumerable,应该没问题。我想我们可以循环读取它们并提取行。到目前为止,没问题。
手头的问题
接下来我们要做的是将数据从所述 DapperRow 转换为 json 字符串,但我似乎无法让数据表现得像 json 字符串,因为 JsonConvert.SerializeObject 惨遭失败。 DapperRow 看起来像这样(再次简化)。
{{DapperRow, Id = '07501399-b385-4d8e-bacc-gad9d04c35f7', UserName = 'test8', ApplicationId = '4721fafb-12e6-4e3c-9298-etd82d18a0cb', IsApproved = 'True', IsLockedOut = 'False', CreateDate = '26-3-2019 07:52:55' }}
我已经研究过SqlMapper.ITypeHandler 之类的东西,但我仍然没有到达那里。例如,对于 TypeHandler,我卡在了 destinationType 上,因为我不想要一个特定的类型——好吧,除了 json 对象。但这不是公认的类型。
public class JsonObjectTypeHandler : SqlMapper.ITypeHandler
{
public void SetValue(IDbDataParameter parameter, object value)
{
parameter.Value = (value == null)
? (object)DBNull.Value
: JsonConvert.SerializeObject(value);
parameter.DbType = DbType.String;
}
public object Parse(Type destinationType, object value)
{
return JsonConvert.DeserializeObject(value.ToString(), destinationType);
}
}
我想到的唯一另一件事是提取每一列并从中构建一个类型对象,但正如我所说,我们不想像我们想要的那样对数据使用模型/类型保持灵活。
谁能指出我正确的方向?我觉得我似乎忽略了一些简单的事情。
【问题讨论】:
-
你不能使用
JsonConvert.SerializeObject(result)吗?