Dapper et conversion d'entiers vers le bas

dapper sqlite system.data.sqlite

Question

Je vérifie la version 1.5 de Dapper avec Sqlite via System.Data.Sqlite. Si je lance cette requête:

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

J'obtiens l'erreur suivante: System.InvalidCastException: Specified cast is not valid

Cela est dû au fait que Sqlite renvoie la valeur ci-dessus sous la forme d'un Int64, que je peux vérifier avec le code suivant. Cela va lancer "Int64":

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

Maintenant, le code suivant va gérer la conversion à la baisse d'Int64 vers 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());

Lorsque je lance cette exception, cela me donne le nombre de lignes réel, indiquant que Dapper a géré la conversion pour moi.

Ma question est la suivante: pourquoi dbc.Query<int> ne gère-t-il pas la conversion descendante de la même manière que dbc.Query<QuerySummary> ? Ce comportement est-il prévu?

Réponse acceptée

Non, ce n'est pas intentionnel. J'ai engagé et poussé les modifications de github qui font la passe suivante (elle échoue à 1.25); il devrait apparaître sur NuGet à un moment donné aussi:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi