Dapper AddDynamicParams для запроса IN с параметром IEnumerable в Postgres

Начнем с того, что у меня та же проблема, которая обсуждалась и якобы была исправлена ​​около двух лет назад. См. следующий вопрос по этой проблеме:

Dapper AddDynamicParams for IN с динамическим именем параметра

Проблема, с которой я сталкиваюсь, заключается в том, что когда я выполняю аналогичный запрос (SELECT * FROM MyTable WHERE MyId IN @myIds) к своей базе данных Postgres 9.3, я получаю следующее исключение:

Npgsql.NpgsqlException : ERROR: 42883: operator does not exist: integer = integer[]

Мой код для выполнения этого запроса выглядит следующим образом:

List<MyTable> result;

var query = "SELECT * FROM MyTable WHERE MyId IN @myIds";
var queryParams = new Dictionary<string, object> {
    { "myIds", new [] { 5, 6 } }
};

var dynamicParams = new DynamicParameters(queryParams);
using (var connection = new NpgsqlConnection(connectionString)) {
    result = connection.Query<MyTable>(query, dynamicParams).ToList();
}

return result;

Если вместо этого я поставлю точку останова в функции Dapper (v1.29) SqlMapper.PackListParameters на строку if (FeatureSupport.Get(command.Connection).Arrays) и вручную перенесу выполнение на другую часть, тогда запрос запустится и вернет ожидаемые результаты.

Я заметил, что свойство .Arrays явно указывает Postgres как поддерживаемую базу данных, поэтому мне интересно: это проблема с моим кодом, кодом Dapper, конфигурацией Dapper или конфигурацией Postgres? Есть ли обходной путь без изменения базы кода Dapper? Спасибо.


person Jeff G    schedule 13.08.2014    source источник


Ответы (1)


Да, это похоже на ошибку, связанную с обработкой типов массивов в postgres; это относится к postgres, поэтому не связано с «предположительно исправленным» сообщением, на которое вы ссылаетесь. Я буду честен с вами: я мало что знаю о массивах postgres - этот код был получен от пользователя, IIRC. Мне было бы очень интересно узнать, работает ли он, если вы используете собственный синтаксис postgres, т.е.

WHERE MyId = ANY(@myIds)

Однако я согласен, что было бы неплохо, если бы один и тот же синтаксис работал в любой СУБД.

На самом деле, однако, он обнаружил еще одну ошибку в этом коде, которую необходимо исправить (в поиске FeatureSupport).

person Marc Gravell    schedule 14.08.2014
comment
WHERE MyId = ANY(@myIds) работает. Перекомпиляция с помощью FeatureSupport {Arrays = false} также позволяет работать обычному WHERE MyId IN @myIds. (Это проблема № 150: github.com/StackExchange/dapper-dot-net /вопросы/150 ) - person Jacob Krall; 28.10.2016
comment
Это ограничено 1000 строк? - person Kody; 04.06.2018
comment
У меня это не работает: Npgsql.PostgresException (0x80004005): 22P03: недопустимые флаги массива; Есть идеи? - person MuriloKunze; 04.10.2018