Altere Dapper para que mapeie um valor nulo do banco de dados para double.NaN
Pergunta
Eu tenho uma coluna dupla anulável em meu banco de dados SQLite.
Ao ler o banco de dados (para colunas do tipo double), gostaria de converter nulos em "double.NaN".
Atualmente dapper define valores nulos como 0, o que eu não quero.
Quais são minhas opções?
- Modifique o código-fonte do Dapper.
- Não consigo usar o Dapper, preciso escrever meu próprio código ADO.NET da maneira antiga?
- mude a maneira como chamo o método cnn.Query para modificar a maneira como o mapeamento acontece.
Minha primeira escolha é a opção 1, mas preciso de ajuda para modificar o Dapper.
Solução
Pessoalmente, aconselho contra isso; um nulo não é exatamente a mesma coisa que NaN. Se você realmente quiser fazer isso, terá que olhar GetTypeDeserializer
. O código para fazer isso é gerado dinamicamente usando ILGenerator
e é bastante complexo. Se você procurar uma linha:
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
é para onde o código desvia se um DbNull
for detectado. O que ele faz atualmente é simplesmente retirar os dois valores (o valor e o alvo) da pilha, jogá-los no chão e continuar. Você precisaria verificar float
/ double
como um caso especial, aplicar sua conversão e atribuir o NaN ao membro.
Repito minha afirmação, porém, de que isso simplesmente não é uma coisa válida a se fazer. Uma opção muito mais simples seria:
public double? Value {get;set;}
que não requer alterações e funcionará atualmente. Se você realmente deseja que ele seja tratado como um duplo não anulável, talvez:
private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }
agora, o padrão será NaN
e se materializará corretamente quando houver valores.