Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义类型的简洁数组_C#_Postgresql_Dapper - Fatal编程技术网

C# 自定义类型的简洁数组

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

使用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 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。