c # Dapper, SplitOn: многократная проблема с одним и тем же параметром - PullRequest
0 голосов
/ 17 сентября 2018

У меня проблема с разделением 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");

1 Ответ

0 голосов
/ 17 сентября 2018

Весь смысл использования 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");
...