0

我正在尝试使用 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[])"
4

1 回答 1

2

我不熟悉 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"}]' });

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

于 2019-03-02T21:58:24.353 回答