Возврат одного параметра как части запроса с несколькими сопоставлениями
У меня есть сценарий, где мне нужно вернуть один столбец как часть запроса нескольких карт в Dapper.
Я упростил приведенный ниже пример, но, по сути, значение одного столбца (int), которое я хочу получить, не является свойством класса Post (но находится в таблице базы данных).
Я хочу получить это значение самостоятельно, так как использую его аналогично следующей строке в примере, где status - это значение int, о котором идет речь:
post.SetSomeStatus(status);
Вот пример кода:
var sql =
@"select *, p.Status from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id";
var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => {
post.Owner = user;
post.SetSomeStatus(status);
return post;
});
var post = data.First();
Я вижу следующую ошибку с этим кодом: индекс был за пределами массива.
1 ответ
Причина ошибки: индекс находился за пределами массива из-за способа, которым Dapper разделял сегменты ответа на запрос, которые должны быть распределены по возвращаемым параметрам Post, User & int в этом примере. Соглашение Dapper заключается в разделении идентификатора поля или предоставлении ваших собственных правил для разделения результирующего набора с помощью параметра splitOn.
Чтобы приведенный выше пример работал:
var sql =
@"select *, p.Status AS ID from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id";
var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => {
post.Owner = user;
post.SetSomeStatus(status);
return post;
});
var post = data.First();
Я нашел еще один вопрос, который также помог мне: правильное использование Multimapping в Dapper