다중 매핑 쿼리의 일부로 단일 매개 변수 반환

c# dapper

문제

Dapper 에서 다중 맵 쿼리의 일부로 단일 열을 반환해야하는 시나리오가 있습니다.

아래의 예제를 간략화했지만 본질적으로 검색하려는 단일 열 값 (int)은 Post 클래스의 속성이 아니라 데이터베이스 테이블에 있습니다.

이 값을 가져 오려면 예제의 다음 줄과 비슷한 방식으로 사용하십시오. 여기서 status는 문제의 int 값입니다.

post.SetSomeStatus(status);

다음은 코드 예제입니다.

  var sql = 
    @"select *, p.Status from #Posts p 
    left join #Users u on u.Id = p.OwnerId
    Order by p.Id";

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

이 코드에서 다음 오류가 표시됩니다. 인덱스가 배열 범위를 벗어났습니다 .

수락 된 답변

오류의 원인 : 인덱스가 배열의 범위를 벗어난 이유는 Dapper가이 예에서 반환 매개 변수 Post, User & int에 할당 할 쿼리 응답의 세그먼트를 분할하는 방식 때문이었습니다. Dapper의 관례는 필드 ID로 분할하거나 splitOn 매개 변수를 사용하여 결과 집합을 분리하는 자체 규칙을 제공하는 것입니다.

위의 예제가 작동하도록하려면 다음을 수행하십시오.

  var sql = 
    @"select *, p.Status AS ID from #Posts p 
    left join #Users u on u.Id = p.OwnerId
    Order by p.Id";

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

나는 또한 나에게 도움이되는 또 다른 질문을 발견했다 : Dapper에서 Multimapping의 올바른 사용



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