使用 ADO.NET 或 Dapper 从 C# 中的 PostgreSQL 视图检索结果时出现“无效返回类型”

问题描述 投票:0回答:1

我正在尝试从我创建的名为 vwindicador_separacao_pedido_inicio_separacao_fisica_resumo 的视图中检索查询结果。 SQL 查询根据 EXTRACT 函数和一些条件逻辑计算给定 id_grupocliente 的某些指标。结果集由 nr_ano、nr_mes 和 pc_aferido 组成。

这是我用于执行查询并映射结果的 C# 代码:

string query =
    @"SELECT * FROM vwindicador_separacao_pedido_inicio_separacao_fisica_resumo WHERE id_grupocliente = @idGrupoCliente";

return (await conn.QueryAsync<IndicadorPortal>(query, new { idGrupoCliente })).ToList();

IndicadorPortal类具有三个属性:nr_anonr_mespc_aferido

public class IndicadorPortal
{
    public int nr_ano { get; set; }
    public int nr_mes { get; set; }
    public decimal pc_aferido { get; set; }
}

但是,当我运行代码时,遇到错误:

Npgsql.PostgresException (0x80004005): 42601: invalid return type
DETAIL: Query-specified return tuple has 17 columns but crosstab returns 19.

这似乎是与返回的列数相关的错误,但我的查询没有使用交叉表功能。

以下是用于创建视图的 SQL 代码:

DROP VIEW IF EXISTS vwindicador_separacao_pedido_inicio_separacao_fisica_resumo;
CREATE VIEW vwindicador_separacao_pedido_inicio_separacao_fisica_resumo AS
SELECT
    EXTRACT(YEAR FROM dt_inclusao)                     nr_ano,
    EXTRACT(Month from dt_inclusao)                    nr_mes,
    sum(case
            when coalesce(iso.data_pedido_separado, now() ) > dt_prazofinalproducao then 0.00
            else 1.00 end::float) / count(*)  pc_aferido,
    a.id_grupocliente
FROM public.vwacompanhamento a
         INNER JOIN vwindicadorsemocorrencias iso ON a.id_sem = iso.id_sem
group by EXTRACT(YEAR FROM dt_inclusao),
         EXTRACT(Month from dt_inclusao)
       , a.id_grupocliente

我也尝试过使用动态类型和 IDictionary 作为返回值,但同样的错误仍然存在。

为了排除故障,我也使用 ADO.NET 测试了代码,但遇到了相同的错误。我正在寻求有关如何解决此问题的指导。

c# .net ado.net dapper
1个回答
0
投票

Postgres 在规划过程中需要知道返回类型和结构,因此不能只返回可变数量的列。我认为,问题就在这段代码中:

sum(case
            when coalesce(iso.data_pedido_separado, now() ) > dt_prazofinalproducao then 0.00
            else 1.00 end::float) / count(*)  pc_aferido,
    a.id_grupocliente

如果我没有记错的话,您将在

when
else
部分返回不同数量的列。

© www.soinside.com 2019 - 2024. All rights reserved.