Возврат одного параметра как части запроса с несколькими сопоставлениями

У меня есть сценарий, где мне нужно вернуть один столбец как часть запроса нескольких карт в 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

Другие вопросы по тегам