使用 Dapper 将 Postgres ARRAY [@tags] 反序列化为 List<string>?
Deserialize Postgres ARRAY [@tags] to List<string> with Dapper?
我将 Dapper 与 Npsql (Postgres) 一起使用。我将序列化的字符串列表保存到一个名为 tags
:
的列中
values.Tags = new List<string>() { "first", "second" };
await Connection.ExecuteAsync(
@"INSERT INTO account (text, tags) VALUES (@text, ARRAY [@tags]);",
new
{
text = values.Text,
tags = values.Tags
}
);
这导致数据库中出现 {{first,second}}
。
我的问题是如何将它读回模型?我需要一些特殊的 SQL,还是可以使用 SELECT id, text, tags FROM account;
?
我怎么知道如何将它反序列化回 List<string>
?
谢谢
这是可用的 TypeHandler class:
public class StringListTypeHandler : SqlMapper.TypeHandler<IList<string>>
{
public override IList<string> Parse(object value)
{
var values = (string[,])value;
IList<string> list = new List<string>();
for (int i = 0; i < values.Length; i++)
{
list.Add(values[0, i]);
}
return list;
}
public override void SetValue(IDbDataParameter parameter, IList<string> value)
{
parameter.Value = value;
}
}
注册为:Dapper.SqlMapper.AddTypeHandler(new StringListTypeHandler());
c# dapper 代码如下所示(注释和注释是字符串列表):
string query = "INSERT INTO calendar.testtable VALUES (@A, @B, @C)";
await connection.ExecuteAsync(query, new { A = model.Key, B = model.Notes, C = model.Comments });
要让 .NET、Dapper 和 Postgres 知道如何处理字符串列表,请创建以下 class。
public class StringListTypeHandler<T> : SqlMapper.TypeHandler<List<string>>
{
public override List<string> Parse(object value)
{
return ((string[])value).ToList();
}
public override void SetValue(IDbDataParameter parameter, List<string> value)
{
parameter.Value = value.ToArray();
}
}
最后,将以下内容添加到 Startup 中的 ConfigureServices() 方法中 class
SqlMapper.AddTypeHandler(new StringListTypeHandler<List<string>>());
我将 Dapper 与 Npsql (Postgres) 一起使用。我将序列化的字符串列表保存到一个名为 tags
:
values.Tags = new List<string>() { "first", "second" };
await Connection.ExecuteAsync(
@"INSERT INTO account (text, tags) VALUES (@text, ARRAY [@tags]);",
new
{
text = values.Text,
tags = values.Tags
}
);
这导致数据库中出现 {{first,second}}
。
我的问题是如何将它读回模型?我需要一些特殊的 SQL,还是可以使用 SELECT id, text, tags FROM account;
?
我怎么知道如何将它反序列化回 List<string>
?
谢谢
这是可用的 TypeHandler class:
public class StringListTypeHandler : SqlMapper.TypeHandler<IList<string>>
{
public override IList<string> Parse(object value)
{
var values = (string[,])value;
IList<string> list = new List<string>();
for (int i = 0; i < values.Length; i++)
{
list.Add(values[0, i]);
}
return list;
}
public override void SetValue(IDbDataParameter parameter, IList<string> value)
{
parameter.Value = value;
}
}
注册为:Dapper.SqlMapper.AddTypeHandler(new StringListTypeHandler());
c# dapper 代码如下所示(注释和注释是字符串列表):
string query = "INSERT INTO calendar.testtable VALUES (@A, @B, @C)";
await connection.ExecuteAsync(query, new { A = model.Key, B = model.Notes, C = model.Comments });
要让 .NET、Dapper 和 Postgres 知道如何处理字符串列表,请创建以下 class。
public class StringListTypeHandler<T> : SqlMapper.TypeHandler<List<string>>
{
public override List<string> Parse(object value)
{
return ((string[])value).ToList();
}
public override void SetValue(IDbDataParameter parameter, List<string> value)
{
parameter.Value = value.ToArray();
}
}
最后,将以下内容添加到 Startup 中的 ConfigureServices() 方法中 class
SqlMapper.AddTypeHandler(new StringListTypeHandler<List<string>>());