Dapper와 Npgsql은 IN 절과 List를 사용하여 EXPLAIN을 사용하여 예외를 throw합니다.

c# dapper npgsql postgresql

문제

Postgresql에서 Npgsql과 Dapper를 통해 실행 계획을 가져 오려고합니다.

그리고 중고 소프트웨어의 버전.

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

List <int>가있는 IN 절을 사용하는 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을 발생시키는 이유는 무엇입니까?

실행 계획을 가져올 수 있습니까?

.

나는 재생산을위한 간단한 프로그램을 썼다.

콘솔 프로젝트에서 실행 중이고 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 []를 사용합니다.

42601을 던지는 dapper와 postgresql을 가진 "WHERE x IN y"절 : \ "$ 1 \"또는 그 근처에서 구문 오류

감사.

인기 답변

나는 Glimpse를 사용한다는 것을 잊었다.
그리고 PgsqlConnection 의해 GlimpseDbConnection 감싸 PgsqlConnection ,이 프로그램은 숨어 있습니다.

Glimpse에 표시되는 EXPLAIN 쿼리를 피하기 위해 두 개의 연결을 사용했습니다.
비 EXPLAIN 쿼리는 GlimpseDbConnection 에 의해 실행되며,
EXPLAIN 쿼리는 PgsqlConnection 의해 실행됩니다.

이제 나는 아래에 대한 정의를 발견했다.

PgsqlConnection
- 할 수 없다 : IN-clause with List<int>
- Can : =any(List<int>)

GlimpseDbConnection (PgsqlConnection 포함)
- Can : IN-clause with List<int>
- 할 수 없습니다 : =any(List<int>)

이러한 차이가 나를 혼란스럽게합니다.

그래서 대답은 "반드시 =any(List<T>) 사용 =any(List<T>) . " 입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.