2016-07-04 1 views
2

В следующем запросе всегда возникает ошибка «42601: ошибка синтаксиса при или около« $ 1 » ».Dapper.net «где ... in» запрос не работает с PostgreSQL

connection.Query<CarStatsProjection>(
       @"select manufacturer, model, year, AVG(price) as averageprice, AVG(miles) as averagemiles, COUNT(*) as count 
         from products 
         where manufacturer IN @manufacturers 
          AND model IN @models 
          AND year IN @years 
         group by manufacturer, model, year", 
       new { manufacturers = new[] { "BMW", "AUDI" }, 
         models = new[] { "M4", "A3" }, 
         years = new[] { 2016, 2015 } }); 

У меня есть это, создав метод ниже и назвав его встроенным, чтобы построить SQL-запрос на данный момент. Хотел бы знать, может ли Dapper справиться с этим с помощью параметра param?

public static string ToInSql(this IEnumerable<object> values) 
    { 
     var flattened = values.Select(x => $"'{x}'"); 
     var flatString = string.Join(", ", flattened); 

     return $"({flatString})"; 
    } 
+0

Вы уверены, что это код, вызывающий ошибку? Строка SQL имеет два параметра (производители и модели), но есть три параметра, которые передаются Dapper (производители, модели и годы); но, Dapper будет игнорировать неиспользуемый параметр, так что это не проблема. Правильно также используется соглашение IN и соглашения Dapper. Строка SQL предваряется символом интерполяции String, но не встречается интерполяция строк. В вашем коде есть что-то еще, что, кажется, отсутствует в вашем сообщении; возможно, интерполяция строк? –

+0

Привет, это произошло потому, что я уже начал использовать метод ToInSql() ниже и просто расстегнул несколько вещей. Я вернул его правильно, как вы можете видеть в обновленном сообщении. Thanks – sjdweb

ответ

5

PostgreSQL IN оператор не поддерживает массив (или любую другую коллекцию) в качестве параметра, только нормальный лист (тот, который вы генерируете с помощью метода ToInSql), для PostgreSQL необходимо использовать оператор ANY , например:

SELECT manufacturer, model, year, AVG(price) as averageprice, AVG(miles) as averagemiles, COUNT(*) as count 
FROM products 
WHERE manufacturer = ANY(@manufacturers) 
AND model = ANY(@models) 
AND year = ANY(@years) 
GROUP BY manufacturer, model, year 
+0

Wow thanks. Работает как сон! – sjdweb

Смежные вопросы