2014-10-02 10 views
2

: 말끔이 '푸'유형에 대한 IDataReader에 분할 할 때Dapper의 멀티 맵을 형식마다 명시 적으로 사용할 수 있습니까? 단정 한 (단정-도트 넷)의 multimap에 의미를 사용할 때 우리는 다음과 같은 기능을 찾고

SqlMapper.Configure.ForTypeUseFunc<T>(Func<dynamic,T> func); 

    //example usage 
     Func<object,Foo> fooFunc = (dynamic o) => 
    new Foo{ 
    Name = o.Name, 
    Status = (StatusTypes)o.StatusID 
    }; 


    SqlMapper.Configure.ForTypeUseFunc<Foo>(fooFunc); 

cnn.Query<Foo,Bar,Foo>... 

는 그래서 모든 값을 전달 동적으로 fooFunc으로 바뀌므로 결과적으로 '막대'에 대해서도 동일하게 적용됩니다. 전달 된 '동적'객체는 분할 열을 나타냅니다 (그리고 일반 다중지도에는 중복 된 열 이름이있을 수 있습니다).

어떻게 해결할 수 있습니까?

배경

우리는 광범위 일부 레거시 데이터베이스에 말끔를 사용하지만, 때문에 오래된 패턴의 많은 등 객체 (다른 열 이름, 중첩 된 객체에 결과를 매핑하는 동적 출력을 사용하도록 강요)

실제로 우리가 수동 매핑을 작성하고 있지만 데이터베이스 (우리가 제어 할 수없는 영역)와 객체 사이의 불일치는 Func에서 완벽하고 명확하게 정의됩니다. 50 개의 테이블 (중형이라고 생각할 것입니다)의 데이터베이스는 매핑하는 데 단지 2 시간 밖에 걸리지 않으며 모든 개발 시간의 아주 작은 부분을 나타냅니다. 그만한 가치가 있습니다.

그게 좋은 부분입니다.

우리가 고민하고있는 부분은 사용했을 때 완벽하게 작동한다고해도 코드에서 올바른 코드 재사용을 얻는 데 어려움을 겪고 있다는 것입니다. 이상적으로 우리는 Dapper의 멀티 맵을 사용하지만 유형별 Func을 할당 할 수있는 방법이 있습니다.

ITypeMap 및 IMemberMap을 살펴본 결과 필드 당 사용자 정의 매핑이 사용 된 것으로 보입니다. 우리는 실제로 유형별 기본 매핑을 찾고 있습니다 (할당을 처리 할 것입니다).

나는 이것을 Dapper 자신에게 (그리고 과거에 그렇게 약간 기여했지만) 기꺼이 만들었지 만 약간의 지침을 좋아할 것입니다.

감사합니다.

UPDATE 나는 현재 Query<dynamic,dynamic,Foo>을 시도하고 있지만 제대로 분할되지

. 제대로 분할되면 우리에게 도움이 될 수 있습니다. 우리는 효과적으로 우리의 FUNC로 각 동적 연결하고 우리의 강력한 형식의 개체를 반환 할 수 :

Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2))); 

답변

0

말끔이 여러 dynamic 유형에 분할 할 수 있도록 충분히 비열한입니다. 우리가 원하는 목표를 달성하는 데 사용할 수있는 많은 비하인드 구현이 있습니다. 아래 하나 있습니다.

Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2))); 

(예 : 사전.

우리가 지금 다루고있는 문제는 중복 열 이름에 숫자가 추가되어 있습니다 (예 : AddressID, AddressID1). 'SELECT * '진술은 그리 유용하지 않습니다.