2017-03-14 1 views
2

option 속성을 사용하여 데이터를 F # 형식으로 변환하려면 어떻게해야합니까? 간단한 예 :Dapper 열에서 F # 옵션 속성

type SomeType = { 
    Count : int option 
} 

connection.QueryAsync<SomeType>(...) 

이 던졌습니다 :

type SomeType = { 
    Count : Nullable<int> 
} 

을하지만 여러 가지 이유로 같은 바람직하지입니다 :

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

대신 옵션의 Nullable 작동 사용. 예를 들어, string option을 사용하는 경우가 있는데 (F #이 null 할당을 정상적으로 허용하지 않기 때문에), Nullable<string>이 컴파일되지 않습니다. Dapper가 자동으로 option 유형을 처리하도록 구성/지시 할 수 있습니까? 매번 사용자 지정 매핑을 사용하지 않으려합니다.

중요한 경우 Npgsql을 사용하십시오.

+0

내가 (당신이 [타입 핸들러]보고 싶을 것 같아요 HTTP : //stackoverflow.com/documentation/dapper/6/type-handlers#t=201703142216128943082). –

+0

흠, 예제는'Option <'T>'와 같은 일반적인 유형을 다루지 않는 것 같습니다. –

+1

Dapper를 사용해야합니까? ['SqlProvider'] (https://fsprojects.github.io/SQLProvider/core/postgresql.html)는 옵션 유형을 다룰 수 있습니다. – s952163

답변

3

개방형 제네릭 용 핸들러를 추가 할 수있는 지원이 없다고 생각하므로 필요한 각 유형별 유형 핸들러를 추가해야합니다.

당신은이 같은 핸들러 정의 할 수 있습니다 :

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) 

를 그리고이 같은 필요로하는 유형 등록 :

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

이상적이지는 않지만 확실히 작동합니다. –