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?

  1. Modifique o código-fonte do Dapper.
  2. Não consigo usar o Dapper, preciso escrever meu próprio código ADO.NET da maneira antiga?
  3. 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top