我正在尝试使用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[])"
答案 0 :(得分: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"}]' });
当然,您可以循环执行此操作。