Как запросить массив JSONB PostgrSQL с Any с Dapper - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь получить запрос, подобный следующему, с помощью 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[])"

1 Ответ

0 голосов
/ 03 марта 2019

Я не знаком с 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"}]' });

И, конечно, вы можете сделать это в цикле.

...