Dapper и нисходящее целочисленное преобразование

Я проверяю версию 1.25 Dapper с Sqlite через System.Data.Sqlite. Если я запускаю этот запрос:

var rowCount = dbc.Query<int>("SELECT COUNT(*) AS RowCount FROM Data").Single();

Я получаю следующую ошибку: System.InvalidCastException: Specified cast is not valid

Это связано с тем, что Sqlite возвращает приведенное выше значение как Int64, что я могу проверить с помощью следующего кода. Это вызовет "Int64":

var row = dbc.Query("SELECT COUNT(*) AS RowCount FROM Data").Single();
Type t = row.RowCount.GetType();
throw new System.Exception(t.FullName);

Теперь следующий код фактически обрабатывает нисходящее преобразование из Int64 в Int32:

public class QuerySummary
{
    public int RecordCount { get; set; }
}
var qs = dbc.Query<QuerySummary>("SELECT COUNT(*) AS RecordCount FROM Data").Single();
rowCount = qs.RecordCount;
throw new System.Exception(rowCount.ToString());

Когда я выбрасываю это исключение, оно дает мне фактическое количество строк, указывая на то, что Dapper обработал преобразование для меня.

Мой вопрос: почему dbc.Query<int> не обрабатывает преобразование вниз так же, как dbc.Query<QuerySummary>? Это предполагаемое поведение?


person John    schedule 16.05.2014    source источник


Ответы (1)


Нет, это не намеренно. Я зафиксировал и отправил изменения в github, которые делают следующий проход (он не работает на 1.25); в какой-то момент он также должен появиться в NuGet:

    // http://stackoverflow.com/q/23696254/23354
    public void DownwardIntegerConversion()
    {
        const string sql = "select cast(42 as bigint) as Value";
        int i = connection.Query<HasInt32>(sql).Single().Value;
        Assert.IsEqualTo(42, i);

        i = connection.Query<int>(sql).Single();
        Assert.IsEqualTo(42, i);
    }
person Marc Gravell    schedule 16.05.2014
comment
Марк, большое спасибо за решение этого так быстро. Я проверил NuGet, но похоже, что он еще не доступен. Я возьму его с Github позже сегодня, если у меня будет время, чтобы протестировать его. Кроме того, я рад сообщить, что проблема, с которой я столкнулся при преобразовании значений Int64 с нулевым значением в Int32, которая существовала в версии 1.13, исчезла в версии 1.25. Отличный материал. - person John; 19.05.2014
comment
Просто краткий отчет: я скачал самую последнюю сборку с Github и протестировал ее в нескольких сценариях, с которыми работал. Он работал отлично, больше никаких исключений. Спасибо еще раз. - person John; 20.05.2014