我有一个问题是Dapper Query在父对象而不是子对象上拆分。结果返回每个孩子一个父母行,从而给许多重复的父母中只有一个孩子。
我正在探索的一个可能问题是,表1和表2的主键是否在拆分功能中引起混淆,因为它们的名称相同(.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");
将ADictionary
与一对多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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句