我正在尝试使精简程序返回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 Issue,When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id", "splitOn和Correct use of Multimapping in Dapper,如果答案是我找不到的答案之一它。
我特意尝试在这里反映答案Correct use of Multimapping in Dapper,但这对我不起作用。
我确实注意到,在绝大多数其他示例中,代码看起来像conn.Query<x, y, x>
(即返回值也列为第一个值)。我不确定这是否重要,甚至我是否能够做自己想做的。我对Dapper很陌生。
提前谢谢!
答案 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();