2016-07-04 66 views
2

以下查詢總是會在$ 1「 」處或附近產生錯誤「42601:語法錯誤」。Dapper.net「where ... 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是否可以用對象參數來處理這個問題?

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字符串以字符串插值符號開頭,但不存在字符串插值。您的代碼中還有一些其他內容似乎從您的帖子中缺失;也許是字符串插值? –

+0

你好 - 這是因爲我已經開始使用下面的ToInSql()方法,只是解開了一些東西。正如您在更新的帖子中看到的那樣,我已經正確地恢復了它。謝謝 – 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

哇謝謝。像夢一樣工作! – sjdweb