TypeHandler 불리지 않는 것 같아.

c# dapper type-conversion

문제

짧은 버전

SqlMapper.Query<T> 내 등록 된 TypeHandler<T> 를 무시하는 것 같습니다.

긴 버전

다음은 간단한 쿼리입니다.

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating

... 여기 두 개의 POCO가 있습니다.

public class RatingValue
{
    public Int32 Value { get; set; }
    // ... some other properties etc ...
}

public class MyResult
{
    public String CategoryName { get; set; }
    public RatingValue CategoryRating { get; set; }
}

CategoryRating Int32RatingValue 객체로 변환 해야하는 새로운 TypeHandler 구현을 만들었습니다.

public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
    public override RatingValue Parse(object value)
    {
        if (value is Int32)
            return new RatingValue() { Value = (Int32)value };

        throw new FormatException("Invalid conversion to RatingValue");
    }

    public override void SetValue(System.Data.IDbDataParameter parameter, RatingValue value)
    {
        // ... null, range checks etc ...
        parameter.DbType = System.Data.DbType.Int32;
        parameter.Value = Int32.Parse(value.Value);
    }
}

자, 내 쿼리를 실행하기 전에 다음과 같이 새 처리기를 추가합니다.

SqlMapper.AddTypeHandler<RatingValue>(new RatingValueHandler());

그러나, 이것을 실행할 때 :

c.Query<MyResult>("SELECT 'Foo' AS CategoryName, 200 AS CategoryRating");

Dapper에서 예외가 발생했습니다. 열 1의 결과를 구문 분석 할 수 없습니다. Dapper가 내 사용자 정의 유형 처리기를 실행하길 기대했습니다 !

나는 아주 명백한 것을 놓치고 있다고 생각합니다. 내가 얼마나 바보인지 말해줘!

수락 된 답변

당신이 바보가되는 것은 아닙니다. 나야. 다음은 이제 로컬로 전달됩니다 (github으로 푸시). NuGet에 곧 출시 될 예정 이며, v1.27 이상 에서는 NuGet 에서 사용할 수 있습니다 .

public void SO24740733_TestCustomValueHandler()
{
    Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
    var foo = connection.Query<MyResult>(
        "SELECT 'Foo' AS CategoryName, 200 AS CategoryRating").Single();

    foo.CategoryName.IsEqualTo("Foo");
    foo.CategoryRating.Value.IsEqualTo(200);
}

public void SO24740733_TestCustomValueSingleColumn()
{
    Dapper.SqlMapper.AddTypeHandler(RatingValueHandler.Default);
    var foo = connection.Query<RatingValue>(
        "SELECT 200 AS CategoryRating").Single();

    foo.Value.IsEqualTo(200);
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.