gpt4 book ai didi

c# - Dapper 和 Npgsql 通过使用带有 IN 子句和 List 的 EXPLAIN 抛出异常

转载 作者:行者123 更新时间:2023-11-29 14:19:12 25 4
gpt4 key购买 nike

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

以及所用软件的版本。

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

带 IN 子句和 List 的非 EXPLAIN 查询可以获取行。

例如:SELECT 1 FROM banana WHERE banana_id IN @BananaIdList

但是 EXPLAIN 查询抛出后跟 Npgsql.NpgsqlException 42601:\"$1\"处或附近的语法错误

例如: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[]。

"WHERE x IN y" clause with dapper and postgresql throwing 42601: syntax error at or near \"$1\"

谢谢。

最佳答案

我忘了我用的是 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>)

关于c# - Dapper 和 Npgsql 通过使用带有 IN 子句和 List<int> 的 EXPLAIN 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com