使用group by时npgsql数据类型未知

时间:2019-06-28 20:22:00

标签: c# postgresql npgsql

我有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>

出现

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

1 个答案:

答案 0 :(得分:0)

此问题作为github问题打开:https://github.com/npgsql/npgsql/issues/2510

答案如下:

  

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

     

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