c#Dapper,SplitOn:多个相同的参数问题多映射一对多

塞巴斯蒂安·林德布鲁姆(Sebastian Lindblom)在津济诺

我有一个问题是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章