C# 自定义类型的简洁数组
使用dapper,我试图映射一个列,它是一个自定义类型的数组,但似乎在任何地方都没有这样的例子。以下是表格定义:C# 自定义类型的简洁数组,c#,postgresql,dapper,C#,Postgresql,Dapper,使用dapper,我试图映射一个列,它是一个自定义类型的数组,但似乎在任何地方都没有这样的例子。以下是表格定义: CREATE TABLE public."Data" ( "Id" bigint NOT NULL DEFAULT nextval('"Data_Id_seq"'::regclass), "Value" real NOT NULL, "UDFs" "UDF"[], "Timestamp" timestamp with time zone NOT NUL
CREATE TABLE public."Data"
(
"Id" bigint NOT NULL DEFAULT nextval('"Data_Id_seq"'::regclass),
"Value" real NOT NULL,
"UDFs" "UDF"[],
"Timestamp" timestamp with time zone NOT NULL,
CONSTRAINT "Data_pkey" PRIMARY KEY ("Id")
)
请注意此处的UDFs列,其定义如下:
CREATE TYPE public."UDF" AS
(
"Name" text,
"Value" text
);
现在,我的模型集如下所示:
public class Data
{
[Key]
public long Id { get; set; }
[Required]
public float Value { get; set; }
[Required]
public DateTime Timestamp { get; set; }
[Required]
public UDF[] UDFs { get; set; }
}
和UDF类:
public class UDF
{
public string Name {get;set;}
public string Value {get;set;}
}
但我有以下例外:
Exception has occurred: CLR/System.InvalidOperationException
An exception of type 'System.InvalidOperationException' occurred in Dapper.dll but was not handled in user code: 'Error parsing column 2 (UDFs=2 - Single)'
at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value)
at Dapper.SqlMapper.<QueryImpl>d__124`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType)
at backend.Repository.DataRepository.FindAll() in c:\Users\davidk\Desktop\ProjectSaturn\backend\Repository\DataRepository.cs:line 43
at backend.Controllers.ValuesController.Get() in c:\Users\davidk\Desktop\ProjectSaturn\backend\Controllers\ValuesController.cs:line 26
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__27.MoveNext()
发生异常:CLR/System.InvalidOperationException
Dapper.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理:“分析列2时出错(UDFs=2-单个)”
在Dapper.SqlMapper.ThrowDataException(Exception ex,Int32索引,IDataReader读取器,对象值)
在Dapper.SqlMapper.d_u124`1.MoveNext()中
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在Dapper.SqlMapper.Query[T](IDbConnection cnn、字符串sql、对象参数、IDbTransaction事务、布尔缓冲、可为null的`1 commandTimeout、可为null的`1 commandType)
在c:\Users\davidk\Desktop\ProjectSaturn\backend\Repository\DataRepository.cs中的backend.Repository.DataRepository.FindAll()处:第43行
在c:\Users\davidk\Desktop\ProjectSaturn\backend\Controllers\valuescoontroller.cs中的backend.Controllers.valuescoontroller.Get()处:第26行
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u27.MoveNext()中
我已经读到您需要使用自定义类型映射器,但我真的看不到这方面的任何好例子。有人知道我在哪里可以找到更多信息吗
哦,我使用的数据库是postgres。您的UDFs列包含一个数组?我认为Dapper无法在单个列中处理数组值。更典型的情况是为UDF创建一个单独的表,然后在查询中加入它们
public class UDF
{
[Key]
public long Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Value { get; set; }
}
public class Data
{
[Key]
public long Id { get; set; }
[Required]
public float Value { get; set; }
[Required]
public DateTime Timestamp { get; set; }
[Required]
public List<UDF> UDFs { get; set; }
}
string sql = @"SELECT
d.Id,
d.Value,
d.Timestamp,
u.name,
u.value
FROM Data d
INNER JOIN UDFTable u ON d.Id = u.Id";
公共类自定义项
{
[关键]
公共长Id{get;set;}
[必需]
公共字符串名称{get;set;}
[必需]
公共字符串值{get;set;}
}
公共类数据
{
[关键]
公共长Id{get;set;}
[必需]
公共浮点值{get;set;}
[必需]
公共日期时间时间戳{get;set;}
[必需]
公共列表UDF{get;set;}
}
字符串sql=@“选择
d、 身份证,
d、 价值观,
d、 时间戳,
u、 名字,
u、 价值观
从数据d
d.Id=u.Id“上的内部联接UDFTable u”;
那你就可以了
QueryAsync<Data, UDF, Data>(
sql,
(data, udf, data) => {
data.UDFs.Add(udf);
return data;
},
new { },
null, true, "Id", null, System.Data.CommandType.Text)
querySync(
sql,
(数据、自定义项、数据)=>{
data.UDFs.Add(udf);
返回数据;
},
新{},
null,true,“Id”,null,System.Data.CommandType.Text)
我实际上研究过这个方法,但我不确定这就是我想要的。如果有多个UDF连接到单个数据行,则内部联接将返回多行。另外,您正在将UDF的键设置为数据行的键,这将不允许数据行和UDF表之间存在1对多关系。唯一的方法是在UDF表上有一个外键列,但我的问题是,我想返回一行数据,即使它们附加了多行UDF。对,UDF表将有一个数据表的外键。u、 在我的示例中,ID是一个数据键(不是UDF的PK)。Dapper不会自动折叠依赖列表。假设有一个数据有两个UDF。您将得到一个包含两个数据对象的列表,除了每个数据对象都包含两个UDF中的一个之外,其他数据对象都是相同的。所以,正如我对这张海报解释的那样,你最终不得不把它们折叠起来。太棒了,谢谢,我以后可能会尝试这个模式,但目前我只是将其转换为JSON。