2012-02-17 1 views
2

J'ai une double colonne Nullable dans ma base de données SQLite.Modifiez Dapper afin qu'il mappe une valeur null de base de données à double.NaN

Lors de la lecture de la base de données (pour les colonnes de type double), je voudrais convertir les nulls en "double.NaN".

Actuellement dapper définit les valeurs nulles à 0, ce que je ne veux pas.

Quelles sont mes options?

  1. Modifier le code source Dapper.
  2. Vous ne pouvez pas utiliser Dapper, besoin d'écrire mon propre code ADO.NET à l'ancienne?
  3. changer la façon dont j'appelle la méthode cnn.query, pour modifier la façon dont cette cartographie se produit.

Mon premier choix est l'option 1, mais j'ai besoin d'aide pour modifier Dapper.

+1

Est-ce que dapper ne supporte pas 'Nullable '? –

+0

@Anthony, oui et dapper fonctionne très bien avec Nullable , malheureusement, ce n'est pas une option pour moi. J'ai une grande application qui utilise le double, et met parfois la valeur à double.NaN. – BrokeMyLegBiking

+1

Je suis un peu inquiet au sujet de l'enveloppe spéciale double et float ... amender dapper va être le moyen le plus sûr pour vous d'aller, et un coalesce (null, ...) serait une autre option. Je ne pense pas que vous devez passer à ado pour cela –

Répondre

6

Personnellement, je déconseille cela; un null n'est pas tout à fait la même chose que NaN. Si vous voulez vraiment faire cela, vous devrez regarder GetTypeDeserializer. Le code pour ce faire est généré dynamiquement en utilisant ILGenerator et est assez complexe. Si vous recherchez une ligne:

il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value] 

c'est là que les branches de code à un si DbNull est détectée. Qu'est-ce qu'il fait actuellement est simplement pop les deux valeurs (la valeur et la cible) de la pile, les déposer sur le sol, et continuer. Vous devrez vérifier float/double comme un cas particulier, appliquez votre conversion, puis attribuez le NaN au membre.

Je répète ma demande, cependant, que ce n'est simplement pas une chose valide à faire. Une option beaucoup plus simple serait:

public double? Value {get;set;} 

qui ne nécessite aucun changement, et qui fonctionnera actuellement. Si vous voulez vraiment vraiment traité comme un double non annulable, peut-être:

private double foo = double.NaN; 
public double Foo { get { return foo; } set { foo = value; } } 

cela maintenant par défaut NaN et matérialiser correctement quand il y a des valeurs.

Questions connexes