Начнем с того, что у меня та же проблема, которая обсуждалась и якобы была исправлена около двух лет назад. См. следующий вопрос по этой проблеме:
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? Спасибо.