Dapper y Npgsql lanzan una excepción mediante el uso de EXPLAIN con IN-cláusula y lista

c# dapper npgsql postgresql

Pregunta

Intento buscar un plan de ejecución de Postgresql a través de Npgsql y Dapper.

Y versiones de software usado.

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

La consulta non-EXPLAIN con IN-cláusula con List <int> puede traer filas.

ex: SELECT 1 FROM banana WHERE banana_id IN @BananaIdList

Pero con los tiros de consulta de EXPLAIN se siguió Npgsql.NpgsqlException 42601: syntax error at or near \"$1\" .

ex: EXPLAIN SELECT 1 FROM banana WHERE banana_id IN @BananaIdList


¿Por qué la sintaxis EXPLAIN con IN-cláusula causa NpgsqlException?

¿Puedo buscar el plan de ejecución?

.

Escribí un programa simple para reproducir.

Al ejecutar el proyecto de consola y WebAPI2 se lanza la misma excepción.

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
    }

}

Encontré una pregunta similar, pero esta pregunta usa Array [].

Cláusula "WHERE x IN y" con dapper y postgresql throwing 42601: error de sintaxis en o cerca de \ "$ 1 \"

Gracias.

Respuesta popular

Olvidé que uso Glimpse.
Y envuelva PgsqlConnection por GlimpseDbConnection , estos programas se ocultan en profundidad.

Utilicé dos conexiones para evitar que se visualizaran las consultas de EXPLAIN en Glimpse,
Las consultas que no son EXPLAIN son ejecutadas por GlimpseDbConnection ,
y las consultas EXPLAIN se ejecutan mediante PgsqlConnection .

Ahora encontré defference sobre abajo.

PgsqlConnection
- No se puede: IN-clause with List<int>
- Can: =any(List<int>)

GlimpseDbConnection (Incluir PgsqlConnection)
- Can: IN-clause with List<int>
- No se puede: =any(List<int>)

Estas diferencias me confunden.

Entonces la respuesta es "DEBE usar =any(List<T>) " .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué