gpt4 book ai didi

c# - 如何使用 Dapper 反序列化数组

转载 作者:行者123 更新时间:2023-12-05 01:35:26 26 4
gpt4 key购买 nike

我有一个模型有 HashSet<int>成员。由于我无法让 Dapper 自动从数组创建集合,我想我会使用多映射查询并将数组作为单独的列获取,拆分它并在 lambda 中创建集合。明确一点,我想反序列化整个模型,而不仅仅是集合的位。

我的第一次多重映射尝试也失败了,所以我决定尝试更简单的方法,获取一个数组并将其反序列化为 List<int>。或 int[] .这就是我被困的地方。

我正在使用 PostgreSQL 12 数据库。

代码片段如下

var query = "SELECT ARRAY[1, 2, 3];";

var ints1 = await _conn.QueryAsync<List<int>>(query); // This returns an empty array
var ints2 = await _conn.QueryAsync<int[]>(query); // System.ArgumentException: Invalid type owner for DynamicMethod.

我不太确定自己做错了什么,Google 似乎也帮不上什么忙,我只找到有关在查询中使用列表的问题。

编辑:好的,我通过将数组转换为 JSON 使其工作,但我仍然觉得这个解决方案很丑陋。有没有办法避免创建 JSON?

最佳答案

不要相信你听到的一切,尽管上面说这是不可能的,但实际上很容易实现。

确实,下面的查询会给你一个错误:(DynamicMethod 的类型所有者无效):

var arrayOfThreeElements =  
(await _conn.QueryAsync<int[]>("SELECT ARRAY[1, 2, 3]"))
.FirstOrDefault();

您需要做的是告诉 dapper 如何使用小型 TypeHandler 处理此问题:

public class GenericArrayHandler<T> : SqlMapper.TypeHandler<T[]>
{
public override void SetValue(IDbDataParameter parameter, T[] value)
{
parameter.Value = value;
}

public override T[] Parse(object value) => (T[]) value;
}

Parse 方法在这里很重要。

然后您只需在添加所有其他类型处理程序的位置添加此处理程序 - 即在您的应用程序或网站的初始化代码中,如下所示:

SqlMapper.AddTypeHandler(new GenericArrayHandler<int>());

现在查询有效并返回整数数组中的 3 个元素 1,2 和 3。

关于c# - 如何使用 Dapper 反序列化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62915756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com