【问题标题】:npgsql data type unknown when using group by使用 group by 时 npgsql 数据类型未知
【发布时间】:2019-07-02 18:43:06
【问题描述】:

我有 2 张桌子:

CREATE TABLE "book" 
(
  "id" serial PRIMARY KEY, 
  "ean_number" TEXT NULL, 
  "title" TEXT NULL 
); 

CREATE TABLE "e_book" 
(
  "id" serial PRIMARY KEY, 
  "ean" TEXT NULL, 
  "title" TEXT NULL, 
  "format" VARCHAR(255) NOT NULL, 
  "physical_book_ean" TEXT NULL 
); 

图书与电子书之间存在一对多或无关系。

我想在我的代码中运行这样的查询:

var q = "select b.*, array_agg(e) ebooks from book b " +
         "left join e_book e on e.physical_book_ean = b.ean_number " +
         "group by b.id";

using (var cmd = new NpgsqlCommand(q, conn))
using (var reader = cmd.ExecuteReader())
    while (reader.Read())
    {
        //read data
    }

array_agg 列电子书作为内容类型出现<unknown>

如何定义内容类型以便阅读?

【问题讨论】:

  • 您好,这个关于数组类型的问题可能很有用github.com/npgsql/npgsql/issues/1980
  • 我看到了这个问题。它被标记为错误。它在一年前有一个相关的提交,并且它已关闭,因此该问题似乎已得到解决。它应该支持数组

标签: c# postgresql npgsql


【解决方案1】:

这是作为 github 问题打开的:https://github.com/npgsql/npgsql/issues/2510

那里给出的答案:

首先,如果您创建 e_book 表并在同一进程中对其进行查询,则需要告诉 Npgsql 重新加载数据库类型定义。这是因为当 Npgsql 首次连接到数据库时,它会加载类型列表并将其缓存 - 但此时 e_book 类型还不存在。如果您再次使用已经存在的表运行应用程序,则应该不再有此问题,或者您可以调用 Npgsql.ReloadTypes()。

其次,您需要在连接字符串上传递 LoadTableComposites=true 标志,告诉 Npgsql 加载所有复合类型 - 包括与表对应的那些。默认情况下 Npgsql 不会这样做,因为表的数量可能很大并且在某些情况下会影响启动性能。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2015-08-11
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多