Dapper和Npgsql通过使用带有IN子句和List <int>

时间:2016-03-08 10:26:16

标签: c# postgresql dapper npgsql

我尝试通过Npgsql和Dapper从Postgresql获取执行计划。

已使用软件的版本。

  • .Net Framework 4.6.1
  • ASP.NET WebAPI 2
  • Postgresql 9.4
  • Npgsql v3.0.5
  • Dapper v1.42.0

IN-clause与List&lt; int&gt;的非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\"

感谢。

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>)