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