Dapper - 단일 반환 값을 사용하는 다중 매핑

dapper

문제

아래는 객체의 페이지 목록을 반환하는 데 사용하는 코드입니다.

        string query = @"
                select * from (select p.*, 
                row_number() over(order by publishdate desc) as rownum,
                count(*) over() as TotalCount
                from blogposts as p) seq
                where seq.rownum between @x and @y";

이 방법이 효과가 있지만 카운트 쿼리에 한 번, 결과 쿼리에 한 번 내 기준을 두 번 정의해야한다는 것을 의미합니다. 문자열 연결에 의존하기보다는 하나의 쿼리 만 실행할 수 있습니다.

        string query = @"
                select * from (select p.*, 
                row_number() over(order by publishdate desc) as rownum,
                count(*) over() as TotalCount
                from blogposts as p) seq
                where seq.rownum between @x and @y";

그러나 Dapper를 사용하여 매핑 할 수없는 것 같습니다. 여러 결과가 없기 때문에 위와 같은 방법을 사용할 수 없습니다. 다중 매핑을 사용하려고했지만 IEnumerable을 반환 할 것으로 예상됩니다.

어떻게하면 다음과 매핑됩니까?

        string query = @"
                select * from (select p.*, 
                row_number() over(order by publishdate desc) as rownum,
                count(*) over() as TotalCount
                from blogposts as p) seq
                where seq.rownum between @x and @y";

감사

수락 된 답변

글쎄 ... 너 ...

당신은 TotalCount 속성을 포함하도록 PostModel을 수정해야합니다 ... 정말 못생긴 것입니다. 또는 동적을 실행하고 추악한 Select 에서 다시 매핑하십시오.

당신은 count (*)를 count(*) over() 으로 count (*) N 번 돌아 오는 중입니다.이 해킹을 사용하는 것은 반드시 빠르지는 않습니다. 필자는 일부 시나리오에서 이중 쿼리를 실행하는 것보다 속도가 느린 것으로 측정했습니다. 특히 모든 열을 선택하지 않았으므로 선택 select count(*) 의 일부 인덱스를 바로 가기 할 수 있습니다. 또한 해킹은 특정 페이징 최적화를 비활성화합니다. 예를 들어 select top N 을 쿼리에 추가 할 수 없습니다.

페이징 쿼리에 대한 나의 추천은 인덱싱을 올바르게하는 것입니다. 이것이 핵심입니다. perf를 측정하고이 해킹이 실제로 도움이되는지 확인하십시오 (올바른 색인 생성이 필요한 경우).

나는 문자열 연결에 관한 관심사를 따르지만, 당신은 언제나 일반적인 헬퍼 메소드를 정의 할 수있다.




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