我试图让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 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很新。
先感谢您!
您需要在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();