题
Dapper查询的结果是我们有一个Dapper行,我想将它作为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字符串,但是由于JsonConvert.SerializeObject失败,我似乎无法使数据表现得像json字符串。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);
}
}
我唯一想到的另一件事是提取每一列并在其中构建一个类型对象,但是正如我所说,我们不想为数据使用模型/类型,因为我们希望保持数据的灵活性。
有人能指出我正确的方向吗?我觉得我似乎忽略了一些简单的事情。
如果您使用的是非类型化的Query
API,则返回的每一行也是IDictionary<string,object>
(除了dynamic
API之外),通常可以与JsonConvert
;一起使用;例如,以下对我有效:
var tables = (from row in await conn.QueryAsync("select top 5 * from sys.tables")
select (IDictionary<string, object>)row).AsList();
var json = JsonConvert.SerializeObject(tables, Formatting.Indented);
System.Console.WriteLine(json);
输出:
[
{
"name": "spt_fallback_db",
"object_id": 117575457,
"principal_id": null,
"schema_id": 1,
"parent_object_id": 0,
"type": "U ",
"type_desc": "USER_TABLE",
"create_date": "2003-04-08T09:18:01.557",
"modify_date": "2017-08-22T19:40:40.763",
"is_ms_shipped": true,
"is_published": false,
"is_schema_published": false,
"lob_data_space_id": 0,
"filestream_data_space_id": null,
"max_column_id_used": 8,
... etc
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句