我有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>
如何定义内容类型以便可以阅读?
答案 0 :(得分:0)
此问题作为github问题打开:https://github.com/npgsql/npgsql/issues/2510
答案如下:
首先,如果创建e_book表并以相同的过程对其进行查询,则需要告诉Npgsql重新加载数据库类型定义。这是因为当Npgsql首次连接到数据库时,它会加载类型列表并对其进行缓存-但那时e_book类型尚不存在。如果您使用已经存在的表再次运行应用程序,则应该不再有此问题,或者可以调用Npgsql.ReloadTypes()。
第二,您需要在连接字符串上传递LoadTableComposites = true标志,告诉Npgsql加载所有复合类型-包括与表相对应的复合类型。默认情况下,Npgsql不会执行此操作,因为表的数量可能很大,并且在某些情况下会影响启动性能。