jsonb_set 使用 Dapper 的功能
jsonb_set function using Dapper
在 PostgreSQL 中,如果我编写此查询,一切正常:
UPDATE states
SET data = jsonb_set(data, '{test}', '"test"')
WHERE object_id = 'string'
RETURNING state_type, object_id, state_id, data
但是如果我想使用 Dapper 在 .NET 中编写类似的查询,则会遇到问题:
Npgsql.PostgresException (0x80004005): 42883: function
jsonb_set(jsonb, text, jsonb) does not exist
这是我的 C# 代码:
var sql = @"UPDATE states
SET data = jsonb_set(data, @key, CAST(@data as jsonb))
WHERE object_id = @objectId";
var result = await dbConnection.QueryFirstAsync<State>(sql, new
{
objectId = "string",
key = "{key}",
data = "test"
});
函数 jsonb_set 接受参数为 (jsonb, text[], jsonb) 而不是 (jsonb, text, jsonb)。所以我将 ::text[] 添加到 @key:
var sql = @"UPDATE states
SET data = jsonb_set(data, @key::text[], CAST(@data as jsonb))
WHERE object_id = @objectId";
在 PostgreSQL 中,如果我编写此查询,一切正常:
UPDATE states
SET data = jsonb_set(data, '{test}', '"test"')
WHERE object_id = 'string'
RETURNING state_type, object_id, state_id, data
但是如果我想使用 Dapper 在 .NET 中编写类似的查询,则会遇到问题:
Npgsql.PostgresException (0x80004005): 42883: function jsonb_set(jsonb, text, jsonb) does not exist
这是我的 C# 代码:
var sql = @"UPDATE states
SET data = jsonb_set(data, @key, CAST(@data as jsonb))
WHERE object_id = @objectId";
var result = await dbConnection.QueryFirstAsync<State>(sql, new
{
objectId = "string",
key = "{key}",
data = "test"
});
函数 jsonb_set 接受参数为 (jsonb, text[], jsonb) 而不是 (jsonb, text, jsonb)。所以我将 ::text[] 添加到 @key:
var sql = @"UPDATE states
SET data = jsonb_set(data, @key::text[], CAST(@data as jsonb))
WHERE object_id = @objectId";