Запрос выдает «функция unnest(unknown) не является уникальной ошибкой», но приложение выполняется нормально.C#

Место общения программистов C#
Anonymous
Запрос выдает «функция unnest(unknown) не является уникальной ошибкой», но приложение выполняется нормально.

Сообщение Anonymous »

Я экспериментировал с составными типами в Postgres и Npgsql и заметил интересное поведение.
У меня есть UDT в базе данных, созданный следующим образом:

Код: Выделить всё

CREATE TYPE ids_test AS (first int, second int);
Кроме того, есть таблица «test», которая отражает UDT: два столбца int, ничего больше.
У меня также есть соответствующий C# класс «test_ids» и сопоставьте его с этим UDT. Запрос довольно простой:

Код: Выделить всё

select *
from test
join (select * from unnest(@idpairs)) as pairs
on pairs.first = test.firstid and pairs.second = test.secondid
Параметр @idpairs передается с использованием динамических параметров:

Код: Выделить всё

    var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@idpairs", ids.Select(_ => new test_ids { first = _.f, second = _.s }).ToList());

var npgsqlConnection1 = new NpgsqlConnection(conStr);
npgsqlConnection1.Open();
npgsqlConnection1.TypeMapper.MapComposite("ids_test");

using (npgsqlConnection1)
{
var res = (await npgsqlConnection1.QueryAsync(query, dynamicParameters)).AsList();
}
Теперь вот та часть, которую я не понимаю. Когда я получаю запрос из журнала CSV, у меня есть запрос и его параметры:

execute: select *
from test
join (выберите * из unnest('{"(1,1)","(2,2)","(3,3)"}')) как пары
на пары.first = test.firstid и пары.секунда = test.секунда
параметры: $1 = '{"(1,1)","(2,2)","(3,3)"}'< /p>

Однако, когда я встраиваю параметр и пытаюсь выполнить запрос, я получаю ошибку «функция unnest(unknown) is not unique». Встроенный запрос:

Код: Выделить всё

select *
from test
join (select * from unnest('{"(1,1)","(2,2)","(3,3)"}')) as pairs
on pairs.first = test.firstid and pairs.second = test.secondid
Насколько я понимаю, встроенный запрос завершается неудачей, поскольку Postgres не может определить, как интерпретировать строку, и требует приведения. Однако я не понимаю, почему запрос из приложения завершается успешно.
Более того, даже если я добавлю явное приведение, результат unnest не будет содержать имена столбцов. Вопрос в том, что делает приложение, чтобы этот запрос работал корректно?

Подробнее здесь: https://stackoverflow.com/questions/787 ... executed-f

Вернуться в «C#»