我已经在我的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
:
但是,当我将其包含在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
答案 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