Я не думаю, что вы можете вызвать 3 из 5 столбцов, возвращенных с одинаковым именем (Guid
), и ожидать, что Dapper выяснит, как правильно разделить.
Предполагая, что имена столбцов возвращаются изSPROC уникальны (я назвал Guid1
, Guid2
и Guid3
), мы разделены на Guid2
(заголовок) и Guid2
(контент).
Поскольку запрос будет возвращать по одной строке на строку, возвращаемую из Proc, нам нужно объединить и сгруппировать по родительскому идентификатору.
Я использовал здесь словарь для этого накопительного пакета:
var sql = "EXEC p_myProc";
var resultDictionary = new Dictionary<Guid, Result>();
var results = connection.Query<Result, Header, Content, Result>(
sql,
(result, header, content) =>
{
if (!resultDictionary.TryGetValue(result.Guid1, out var existingResult))
{
result.Headers = new List<Header>();
result.Content = new List<Content>();
resultDictionary.Add(result.Guid1, result);
existingResult = result;
}
// Noting OP has defined the Child tables as immutable IEnumerable<>
(existingResult.Headers as List<Header>).Add(header);
(existingResult.Content as List<Content>).Add(content);
return existingResult;
},
splitOn: "Guid2,Guid3")
.Distinct() // Strip duplicates by reference equality
.ToList();
Обратите внимание, что в результатах, возвращаемых Query
, будет столько строк, сколько возвращает proc, но потому что мы будем возвращать одну и ту же ссылку Result
для каждого Guid1
key, Distinct()
удалит дубликаты.
Альтернативой этому подходу было бы сопоставить сглаженный результат сохраненного процесса во временном DOC POCO 1: 1 со всеми 5 столбцами, а затем использоватьLINQ в памяти для GroupBy Guid1
для проецирования Header
и Content
children.