Dapper지도 속성

c# dapper

문제

안녕하세요, 다음 클래스가 있습니다 (단순화).

Member.cs

public string FirstName { get; set; }
public string LastName { get; set; }
public Place Address { get; set; }

Place.cs

public string Address{ get; set; }
public string City { get; set; }
public string PostalZip { get; set; }

SQL 서버에서 얻은 응답은 다음과 같습니다.

Id  FirstName   LastName    AddressAddress      AddressCity
-----------------------------------------------------------------------------
113     First       Last        Some Address        Some City

내가 이것을 실행할 때 :

var members = session.Connection.Query<Member>(dataQuery, p, transaction).ToList();

그것은 멤버 파트를 잘 맵핑하지만 Member (place.cs)의 Address 속성은 맵핑되지 않은 채로 남아 있습니다. 어떻게 맵핑 할지를 dapper에게 알려주는 방법은 무엇입니까?

수락 된 답변

PostalZip이 장소 유형이 아니라 단순한 문자열이라고 가정하면 Dapper 쿼리를 다음과 같이 만들 수 있습니다.

using (IDbConnection connection = OpenConnection())
{
    string query = @"SELECT Id,FirstName,LastName,
                    0 as splitterID, Address, City, PostalZip 
                    FROM Members";
    var result = connection.Query<Member, Place, Member>(query, (mb, pl) =>
    {
        mb.Address = pl;
        return mb;
    },
    splitOn: "splitterID");
}

이 쿼리는 Members 테이블의 모든 레코드를 IEnumerable<Member> 변수로 반환합니다. IEnumerable (멤버)의 각 요소는 Address 필드가 Address, City 및 PostalCode가있는 레코드의 두 번째 부분에서 추출 된 장소로 설정됩니다.

트릭은 Query 메서드에 전달되는 람다 식에 있습니다. 여기서 우리는 Func가 Dapper 내부 멤버로부터 멤버와 장소를받는 것으로 멤버로 선언합니다.
Dapper 라이브러리는 splitOn 매개 변수로 정의 된 fake field splitterID splitOn 인스턴스를 Member 인스턴스와 함께 lambda에 전달할 때 Place 유형의 인스턴스를 작성해야 할 필요성을 인식합니다.

람다 식은 Place 인스턴스를 Member 인스턴스의 Address 속성에 할당하고 올바르게 초기화 된 동일한 Member 인스턴스를 반환합니다.

(필자는 Address 필드와 직접 분리 할 수 ​​없었으며 가짜 필드 없이도이를 수행 할 수있는 방법이 있는지 궁금해 할 것입니다.)



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow