Dapper splitOn错误

问题描述 投票:0回答:1

我试图让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很新。

先感谢您!

c# dapper
1个回答
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个对象,第1个转换为int对象,第2个和第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();
© www.soinside.com 2019 - 2024. All rights reserved.