c# - c# Dapper,SplitOn:多个相同参数问题多映射一对多
问题描述
我有一个问题是 Dapper Query 在父对象而不是子对象上拆分。结果为每个孩子返回一个父行,给出许多重复的父母,其中只有 1 个孩子。
我正在探索的一个可能的问题是 table1 和 table2 的主键是否会在拆分函数中引起一些混乱,因为它们具有相同的名称 (.Id)。
问题是,我如何拆分父子行,以便它可以使用 SplitOn 中的相同参数将许多子模型绑定到一个父模型:?
==================================================== ========================
结论
在评论中,我们得出结论,字典需要在函数之外,不需要多个 SplitOn:,一个就足够了。
最后,字典确实提供了一个独特的 Table1 集合,每个集合都有代表孩子。
有关更多详细信息,请参阅评论。
==================================================== =========================
var sql = $@"
SELECT * FROM Table1 t
INNER JOIN Table2 c ON c.Table1_Id = t.Id;";
var result = connection.Query<Table1, Table2, Table1>(
sql,
(table1, table2) =>
{
Table1 table1Entry;
Dictionary<int?, Table1> table1Dictionary = new Dictionary<int?, Table1>();
if (!table1Dictionary.TryGetValue(table1.Id, out tableEntry))
{
table1Entry = table1;
table1Entry.table2s = new List<Table2>();
tableDictionary.Add(table1Entry.Id, table1Entry);
}
tableEntry.table2s.Add(table2);
return table1Entry;
},
new
{
},
splitOn: "Id,Id");
解决方案
Dictionary
将 a与一对多 Dapper 查询一起使用的全部意义在于,您可以跟踪以前的父母。为此,它必须在Query
调用之外定义。您所拥有的内容将在每次尝试在其中查找之前创建一个新字典,因此它将始终为空。
此外,如果两个表的第一列都是“Id”,那么您不需要在splitOn
.
Dictionary<int?, Table1> table1Dictionary = new Dictionary<int?, Table1>();
var result = connection.Query<Table1, Table2, Table1>(
sql,
(table1, table2) =>
{
Table1 table1Entry;
if (!table1Dictionary.TryGetValue(table1.Id, out tableEntry))
{
table1Entry = table1;
table1Entry.table2s = new List<Table2>();
tableDictionary.Add(table1Entry.Id, table1Entry);
}
tableEntry.table2s.Add(table2);
return table1Entry;
},
new
{
},
splitOn: "Id");
推荐阅读
- javascript - 脚本在 PHP5 > PHP7.2 之后停止工作?
- python - 在 /usr/bin 中为 python 创建一个链接?
- c# - 找不到 ConfigurationErrorsException nuget 包或程序集 .net Core 2.2
- big-o - 为什么这个片段是 O(n)?
- reactjs - npm WARN deprecated circular-json@0.3.3: CircularJSON 仅在维护中,flatted 是它的继任者
- python - python:在没有for循环的情况下标记元组列表
- excel - 仅打印选定的工作表...但活动工作表继续打印
- javascript - Chart.Js 滞后:是否有任何开源工具可以处理 8000 万个值?
- git - 在 Git 中查看删除之前恢复的文件的历史记录
- javascript - JavaScript 未按预期在 HTML 网站上显示