我尝试通过Npgsql和Dapper从Postgresql获取执行计划。
已使用软件的版本。
IN-clause与List< int>的非EXPLAIN查询可以获取行。
ex: SELECT 1 FROM banana WHERE banana_id IN @BananaIdList
但是使用EXPLAIN查询抛出了Npgsql.NpgsqlException 42601: syntax error at or near \"$1\"
。
ex: EXPLAIN SELECT 1 FROM banana WHERE banana_id IN @BananaIdList
为什么带有IN子句的EXPLAIN语法会导致NpgsqlException?
我可以获取执行计划吗?
我写了一个简单的程序来重现。
在Console项目和WebAPI2上运行会抛出相同的异常。
public class BadQuery {
public async Task Test() {
const string Sql = "EXPLAIN SELECT 1 FROM banana WHERE banana_id IN @BananaIdList";
var parameters = new DynamicParameters();
parameters.Add("@BananaIdList", new List<int> {1, 2, 3});
var conn = new NpgsqlConnection("Server=127.0.0.1; Port=******; Database=******; User Id=******; Password=******;");
conn.Open();
var results = await conn.QueryAsync<string>(Sql, parameters); // throws NpgsqlException
}
}
我发现了一个类似的问题,但这个问题使用了Array []。
"WHERE x IN y" clause with dapper and postgresql throwing 42601: syntax error at or near \"$1\"
感谢。
答案 0 :(得分:3)
我忘记了我使用Glimpse
并PgsqlConnection
包裹GlimpseDbConnection
,这些程序隐藏在深处。
我使用了两个连接来避免在Glimpse上显示EXPLAIN查询
非EXPLAIN查询由GlimpseDbConnection
执行
并且,EXPLAIN查询由PgsqlConnection
执行。
现在我发现了下面的差异。
<强> PgsqlConnection 强>
- 不能:IN-clause with List<int>
- 可以:=any(List<int>)
GlimpseDbConnection(包括PgsqlConnection)
- 可以:IN-clause with List<int>
- 不能:=any(List<int>)
这些差异使我感到困惑。
所以答案是 “必须使用=any(List<T>)
” 。