Cambia Dapper in modo che esegua il mapping di un valore null del database a double.NaN

.net ado.net dapper sqlite

Domanda

Ho una doppia colonna nullable nel mio database SQLite.

Durante la lettura dal database (per colonne di tipo double) vorrei convertire i null in "double.NaN".

Attualmente dapper imposta valori nulli a 0, che non voglio.

Quali sono le mie opzioni?

  1. Modifica il codice sorgente di Dapper.
  2. Non è possibile utilizzare Dapper, è necessario scrivere il mio codice ADO.NET alla vecchia maniera?
  3. cambia il modo in cui chiamo il metodo cnn.Query, per modificare il modo in cui avviene la mappatura.

La mia prima scelta è l'opzione 1, ma ho bisogno di aiuto per modificare Dapper.

Risposta accettata

Personalmente, consiglierò contro questo; un null non è esattamente la stessa cosa di NaN. Se vuoi davvero farlo, dovresti dare un'occhiata a GetTypeDeserializer . Il codice per eseguire questa operazione viene generato in modo dinamico utilizzando ILGenerator ed è piuttosto complesso. Se cerchi una linea:

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

questo è il punto in cui il codice si dirama se viene rilevato un DbNull . Quello che fa attualmente è semplicemente inserire i due valori (il valore e il target) dallo stack, rilasciarli sul pavimento e andare avanti. Dovresti verificare la presenza di float / double come caso speciale, applicare la conversione, quindi assegnare il NaN al membro.

Ripeto la mia richiesta, però, che questa semplicemente non è una cosa valida da fare. Un'opzione molto più semplice sarebbe:

public double? Value {get;set;}

che richiede zero cambiamenti e funzionerà al momento. Se davvero vuoi che venga trattato come un doppio non nullable, forse:

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

questo sarà ora predefinito in NaN e si materializzerà correttamente quando ci sono valori.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché