C# Dapper, SplitOn: множественные проблемы с одним и тем же параметром
У меня есть проблема, если Dapper разделяет запросы на родительский объект, а не на дочерний объект. Результат возвращает одну родительскую строку на каждого ребенка, давая много дублирующих родителей, в которых есть только один ребенок.
Одна из возможных проблем, которую я изучаю, заключается в том, что первичный ключ table1 и table2 вызывает некоторую путаницу в функции split, поскольку они имеют одинаковые имена (.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 ответ
Весь смысл использования 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");