Conversión de enteros aptos y descendentes

dapper sqlite system.data.sqlite

Pregunta

Estoy revisando v1.25 de Dapper con Sqlite a través de System.Data.Sqlite. Si ejecuto esta consulta:

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

Aparece el siguiente error: System.InvalidCastException: Specified cast is not valid

Esto se debe a que Sqlite devuelve el valor anterior como Int64, que puedo verificar con el siguiente código. Esto lanzará "Int64":

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

Ahora, el siguiente código realmente manejará la conversión descendente de Int64 a 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());

Cuando lanzo esta excepción, me da el recuento de filas reales, lo que indica que Dapper manejó la conversión por mí.

Mi pregunta es, ¿por qué es que dbc.Query<int> no maneja la conversión descendente de forma similar a dbc.Query<QuerySummary> ? ¿Es este comportamiento intencionado?

Respuesta aceptada

No, eso no es intencional. He confirmado y enviado cambios a github, lo que hace que el siguiente pase (falla en 1.25); debería aparecer en NuGet en algún momento pronto también:

    // 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);
    }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué