Dapper column a la propiedad de opción F #

dapper f# optional

Pregunta

¿Cómo consigo que Dapper convierta los datos a un tipo F # con una propiedad de option ? Ejemplo simple:

type SomeType = {
    Count : int option
}

connection.QueryAsync<SomeType>(...)

Esto arroja:

System.InvalidOperationException
    A parameterless default constructor or one matching signature
    (System.Int32 count) is required for SomeType materialization

Usar Nullable lugar de opción funciona:

type SomeType = {
    Count : Nullable<int>
}

Pero no es tan deseable por varias razones. Por un lado, tengo casos en los que uso la string option (porque F # no permite asignaciones nulas normalmente, lo cual es genial), y Nullable<string> no compila. ¿Hay alguna manera de configurar / instruir a Dapper para tratar automáticamente con los tipos de option ? Me gustaría evitar el uso de mapeos personalizados todo el tiempo.

En caso de que importe, usando con Npgsql.

Respuesta aceptada

No creo que haya ningún soporte para agregar controladores para genéricos abiertos, por lo que tendría que agregar un controlador de tipo para cada tipo que necesite.

Podrías definir un manejador como este:

type OptionHandler<'T>() =
    inherit SqlMapper.TypeHandler<option<'T>>()

    override __.SetValue(param, value) = 
        let valueOrNull = 
            match value with
            | Some x -> box x
            | None -> null

        param.Value <- valueOrNull    

    override __.Parse value =
        if isNull value || value = box DBNull.Value 
        then None
        else Some (value :?> 'T)

Y regístrese para los tipos que necesita así:

SqlMapper.AddTypeHandler (OptionHandler<string>())
SqlMapper.AddTypeHandler (OptionHandler<int>())


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué