我有一个List<Guid>(也尝试过使用普通数组)要在查询中使用。Dapper生成SQL并正确地将参数替换为带编号的参数。但是,PG抱怨list参数的语法。没有进一步的细节。复制生成的SQL并用实际值替换数字(将parens添加到列表参数中),查询工作。
下面是生成的SQL中的违规子句:

WHERE (
    names.tenant = $1
    AND scan_results.tenant = $1
    AND scan_results.scan IN $2
)

Dapper的原始语句字符串如下:
WHERE (
    file_names.tenant = @tenantId
    AND scan_results.tenant = @tenantId
    AND scan_results.scan IN @validScans
)

查询使用con.Query执行,如下所示:
con.Query(stmt, new
{
    tenantId = tenant.Id,
    validScans = tenant.LatestScans // .ToArray()
});

确切的Postgres错误是:
ERROR:  syntax error at or near "$2" at character ...

最佳答案

结果我对PGSQL和Dapper都有一些误解。首先,参数周围需要paren,其次,我需要使用ANY,而不是IN
所以正确的SQL如下:AND scan_results.scan = ANY (@validScans)

10-04 14:45