如何使用 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"}]' });

当然,您可以循环执行此操作。