如何使用 Dapper 查询带有 Any 的 PostgreSQL JSONB 数组
How to query PostgrSQL JSONB array with Any with Dapper
我正在尝试使用 Dapper 进行如下查询。关于 json 的文档虽然有点少,但我至今无法弄明白。
基本上我需要运行一个类似于这个的查询。
select * from table
WHERE jsonbfield @> ANY (ARRAY ['[{"property1": "value1", "property2":"value2"}]', '[{"property1": "value3", "property2": "value4"}]']::jsonb[]);
如何通过参数传递它?
这里有一些我到目前为止尝试过的更多细节。
该字段包含像这样的聚合数据 jsonb.
Similar to this
[{
"property1": "value1",
"property2": "value2,
},
{
"property1": "value3",
"property2": "value4,
}]
如评论中所述,sql 查询实际上正在运行并返回我需要的内容。但是,到目前为止,我无法将数据作为参数传递。如果我将它直接包含在查询中,它工作正常。但我更愿意使用参数。
所以这是有效的。
"select * from table where jsonbfield @> ANY (ARRAY['[{\"property1\": \"value1\"}]']::jsonb[])"
这不是
var parameter = "'[{\"property1\": \"value1\"}]'";
"select * from table where jsonbfield @> ANY (ARRAY[@parameter]::jsonb[])"
我不熟悉 Dapper,但问题很可能是在参数周围包含引号。大多数 ORM 会自己引用绑定参数。多余的引号将按字面意思。
var parameter = "[{\"property1\": \"value1\"}]";
鉴于您有一个带有查询构建器的 ORM,使用 .OrWhere
可能比构建 jsonb 对象的 Postgres 数组更简单。他们的表现应该相当。
var builder = new SqlBuilder();
var sql = builder.AddTemplate("select * from foo");
builder.OrWhere("jsonb @> @a::jsonb", new { a = '[{"property1": "value1", "property2": "value2"}]' });
builder.OrWhere("jsonb @> @a::jsonb", new { a = '[{"property1": "value3", "property2": "value4"}]' });
当然,您可以循环执行此操作。
我正在尝试使用 Dapper 进行如下查询。关于 json 的文档虽然有点少,但我至今无法弄明白。
基本上我需要运行一个类似于这个的查询。
select * from table
WHERE jsonbfield @> ANY (ARRAY ['[{"property1": "value1", "property2":"value2"}]', '[{"property1": "value3", "property2": "value4"}]']::jsonb[]);
如何通过参数传递它?
这里有一些我到目前为止尝试过的更多细节。 该字段包含像这样的聚合数据 jsonb.
Similar to this
[{
"property1": "value1",
"property2": "value2,
},
{
"property1": "value3",
"property2": "value4,
}]
如评论中所述,sql 查询实际上正在运行并返回我需要的内容。但是,到目前为止,我无法将数据作为参数传递。如果我将它直接包含在查询中,它工作正常。但我更愿意使用参数。
所以这是有效的。
"select * from table where jsonbfield @> ANY (ARRAY['[{\"property1\": \"value1\"}]']::jsonb[])"
这不是
var parameter = "'[{\"property1\": \"value1\"}]'";
"select * from table where jsonbfield @> ANY (ARRAY[@parameter]::jsonb[])"
我不熟悉 Dapper,但问题很可能是在参数周围包含引号。大多数 ORM 会自己引用绑定参数。多余的引号将按字面意思。
var parameter = "[{\"property1\": \"value1\"}]";
鉴于您有一个带有查询构建器的 ORM,使用 .OrWhere
可能比构建 jsonb 对象的 Postgres 数组更简单。他们的表现应该相当。
var builder = new SqlBuilder();
var sql = builder.AddTemplate("select * from foo");
builder.OrWhere("jsonb @> @a::jsonb", new { a = '[{"property1": "value1", "property2": "value2"}]' });
builder.OrWhere("jsonb @> @a::jsonb", new { a = '[{"property1": "value3", "property2": "value4"}]' });
当然,您可以循环执行此操作。