【问题标题】:Dapper splitOn errorDapper splitOn 错误
【发布时间】:2018-08-21 17:33:28
【问题描述】:

我正在尝试让 dapper 返回 List<KeyValuePair<int, dynamic>>

我提出了我认为最简单的查询来说明问题:

using (SqlConnection conn = new SqlConnection(_connectionString))
{
            return conn.Query<int, string, bool, KeyValuePair<int, dynamic>>("SELECT 1 AS 'SomeInt', 'A' AS 'SomeString', 'True' AS 'SomeBool'", (i, s, b) =>
                new KeyValuePair<int, dynamic>(
                    i,
                    new
                    {
                        TheString = s,
                        TheBool = b
                    }
                ), splitOn: "SomeString").AsList();
}

当我尝试运行它时,我得到System.ArgumentException: 'When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id

我认为我将splitOn 参数正确指定为SomeString ...?

我查看了有关此错误的其他一些 SO 问题,包括 Dapper Multi-mapping IssueWhen using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id", "splitOnCorrect use of Multimapping in Dapper,如果答案在其中一个我找不到。

我专门尝试在Correct use of Multimapping in Dapper 上反映答案,但它对我不起作用。

我确实注意到,在绝大多数其他示例中,代码看起来像 conn.Query&lt;x, y, x&gt;(即返回值也被列为第一个值)。我不确定这是否重要,或者即使我能够做我想做的事。我对 Dapper 很陌生。

提前谢谢你!

【问题讨论】:

  • 您能详细说明为什么 List> 是理想的结果吗?
  • @ParrishHusband 我真正想要的是List&lt;KeyValuePair&lt;int, Tuple&lt;string, bool&gt;&gt;&gt;,但我想命名字符串和布尔值,而不是item1item2。我知道我可以创建一个带有字符串和 bool 的类,并将 dapper 映射到该类,但这是整个代码库中我会引用该类的唯一位置,所以看起来……我猜想太多了. (这是在 API 中,所以在执行查询后,我将结果作为 JSON 发送到前端网站,我不希望前端必须处理 item1item2。)
  • “这是整个代码库中唯一我会引用该类的地方”。现在这可能是真的,但如果需求在未来发生变化,你就会被困在试图操纵复杂的结构而不仅仅是基本的封装。 Dapper 的优势在于轻松连接您的 POCO 课程,而无需像现在这样在杂草中挖掘。
  • 每个 int、string、bool 对象都需要一个 splitOn 值,最终类型是您的返回对象

标签: c# dapper


【解决方案1】:

您需要在 splitOn 值中添加其他字段,因为每个字段都是不同的类。由于每个都可以映射到单独的 POCO 类,但在您的情况下,每个都是不同的值。

using (SqlConnection conn = new SqlConnection(_connectionString))
{
    return conn
        .Query<int, string, string, KeyValuePair<int, dynamic>>(
            "SELECT 1 AS 'SomeInt', 'A' AS 'SomeString', 'True' AS 'SomeBool'",
            (i, s, b) =>
                new KeyValuePair<int, dynamic>(
                    i,
                    new
                    {
                        TheString = s,
                        TheBool = Convert.ToBoolean(b)
                    }),
            splitOn: "SomeInt,SomeString,SomeBool")
        .AsList();
}

我还必须修复布尔值,因为它没有正确转换。也许在您的情况下,它是从实际的数据库表中读取的并且可以工作。

为了说明splitOn 的强大功能,对上一个答案进行以下修改。这会将 SQL 查询返回的 3 个值拆分为 2 个对象,第一个拆分为 int 对象,第二个和第三个拆分为单个 dynamic 对象:

conn
    .Query<int, dynamic, KeyValuePair<int, dynamic>>(
        "SELECT 1 AS 'SomeInt', 'A' AS 'SomeString', 'True' AS 'SomeBoolean'",
        map: (i, d) => new KeyValuePair<int, dynamic>(i, new
        {
            TheString = d.SomeString, 
            TheBool = d.SomeBoolean
        }),
        splitOn: "SomeInt,SomeString")
   .AsList();

【讨论】:

  • 是的。我意识到在发布问题后需要转换布尔值。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2015-04-13
  • 2015-05-31
相关资源
最近更新 更多