当我使用Dapper运行Npgsql查询时,为什么会显示“字段'XYZ'具有Npgsql当前未知的类型”

时间:2019-09-11 13:50:00

标签: asp.net dapper npgsql

我已经在我的PostgreSql数据库中创建了以下SQL视图(为简便起见已简化):

create view "GlossaryView" as 
select 
    (
        select cast(
            array_agg(
                cast(quals as "Qualification")
            ) as "Qualification"[]
        ) as "Qualifications" 
        from 
        (
            select * from "Qualification"
        ) as quals
    );

Qualification是我数据库中的一个表。使用psql在本地对此视图运行查询会很好。

但是,如果我使用Dapper运行以下查询:

connection.QueryAsync<dynamic>("select * from \"GlossaryView\" ");

标题中出现异常,XYZ替换为Qualifications

我遇到了这个答案,它建议在连接字符串中使用LoadTableComposites=true

  

https://stackoverflow.com/a/56850677

但是,当我将其包含在appsettings.json文件的连接字符串中时,在应用程序启动期间会出现此异常:

  

不支持关键字“ LoadTableComposites”


问题:如何在Dapper中运行查询?我怀疑不是Dapper而是Npgsql。

Npgsql版本:3.2.6


编辑1:这是Qualification表结构:

          Table "public.Qualification"
 Column | Type | Collation | Nullable | Default 
--------+------+-----------+----------+---------
 Id     | uuid |           | not null | 
 Name   | text |           |          | 
Indexes:
    "PK_Qualification" PRIMARY KEY, btree ("Id")
Referenced by:
    TABLE ""User"" CONSTRAINT "FK_User_Qualification_QualificationId" 
        FOREIGN KEY ("QualificationId") REFERENCES "Qualification"("Id") ON DELETE CASCADE

1 个答案:

答案 0 :(得分:1)

使用Npgsql 4.0.10和Dapper 2.0.4,下面的代码段将为您提供所需的内容。

注意,我按照注释中的建议将“加载复合类型”添加到了连接字符串中,并使用了Npgsql的typemapper将CLR类型映射到PostgreSQL类型。您需要将连接实例化为NpgsqlConnection而不是IDbConnection(通常由Dapper建议)。

当我为代码段创建测试对象时,我没有使用带引号的标识符。您需要调整代码段,以补偿实现中带引号的标识符。

有关映射CLR类型的信息,可以找到here

   public class QualificationType
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (NpgsqlConnection conn = new NpgsqlConnection("Host=localhost;Database=postgres;username=postgres;password=!@#$%^&;Load Table Composites= true"))
            {
                conn.Open();
                conn.TypeMapper.MapComposite<QualificationType>("qualification");

                var results = conn.Query("Select * from glossaryview").AsList();

                var o = results[0].qualifications;

                foreach ( var t in o)
                {
                    Console.WriteLine($"id: {t.Id}, name: {t.Name}");
                }


            }
        }
    }

该代码段的结果返回了以下内容;

id: d3c47de5-ab49-498e-be24-b77f8bb587fd, name: abc
id: 4089576a-d0a1-4570-b601-f54f98784ab2, name: def
id: 123e0722-9ade-48c7-937c-aa21214bee57, name: ghi