Dapper의 IEnumerable을 수행합니까? 연기되었거나 즉각 처형 되었습니까?

c# dapper deferred-execution ienumerable orm

문제

Dapper에서 쿼리를 실행하고 레코드 블록 만 검색하려는 경우 .Skip ()을 사용할 수 있습니까? Take () 또는 SQL에서 select n *를 사용해야합니까?

예를 들어 10,000 개의 레코드가있는 테이블이 있고 목록 페이지가 페이지 당 200 개만 표시되기 때문에 처음 200 개만 필요합니다. 나는 이것을 실행합니까?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);

아니면 이거:

conn.Query<Widget>("select top 200 * from Widgets");

Dapper의 .Query<T> 메소드가 연기 되었습니까?

수락 된 답변

SELECT TOP n... 사용해야합니다.

Query<T> 메서드는 선택적 매개 변수 bool buffered = true 로 설정하면 true가 전체 결과 집합을 반복하면서 각 행을 List<T> 로 읽습니다. 이 매개 변수를 false로 IEnumerable<T> 있고 결과 IEnumerable<T> 은 사용하기 전까지 db 쿼리가 실행되지 않는다는 의미에서 "지연"되고 행은 db 쪽에서 한 번에 하나씩 검색됩니다 "(각 반복에서 IDataReader.Read 를 호출 IDataReader.Read ).

그래서, "지연"될 수 있습니다. 그러나 만약 당신이 여전히 클라이언트에 그 첫 번째 n 개의 행을 전송할 수 있습니다 그렇지 않으면 당신은 여전히 ​​실행하고 DB 측면에서 10000 레코드에 대한 결과 집합을 준비하기 때문에 당신은 여전히 TOP n 사용해야합니다.



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