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

Seb*_*ino 4 c# one-to-many multi-mapping dapper-extensions

我有一个问题是 Dapper Query 在父对象上分割,而不是在子对象上分割。结果为每个子项返回一个父行,从而给出许多重复的父项,其中只有 1 个子项。

我正在探索的一个可能的问题是,table1 和 table2 的主键是否会在 split 函数中造成一些混乱,因为它们具有相同的名称 (.Id)。

问题是,如何拆分父子行,以便可以使用 SplitOn: 中的相同参数将许多子项绑定到一个父模型?

=================================================== =======================

结论

在评论中我们得出的结论是字典需要在函数之外,不需要多个SplitOn:,一个就足够了。

最后,字典确实提供了表 1 的不同集合,每个表都代表孩子。

请参阅评论了解更多详情。

=================================================== =======================

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");
Run Code Online (Sandbox Code Playgroud)

juh*_*arr 5

使用Dictionary一对多 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");
Run Code Online (Sandbox Code Playgroud)