Dapper splitOn错误

时间:2018-08-21 17:33:29

标签: c# 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<x, y, x>(即返回值也列为第一个值)。我不确定这是否重要,甚至我是否能够做自己想做的。我对Dapper很陌生。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

您需要在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对象,第二个和第3个分为单个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();