2013-10-19 17 views
7

Khi tôi thực hiện một truy vấn trong Dapper và chỉ muốn truy xuất một khối bản ghi, tôi có thể sử dụng .Skip(). Take(), hoặc tôi có cần sử dụng lựa chọn đầu n * trong SQL không?Trình duyệt IEnumerable <T> của Dapper có hoãn lại hoặc thực thi ngay lập tức không?

ví dụ: Cho một bảng có 10.000 bản ghi và tôi chỉ muốn 200 đầu tiên vì trang danh sách của tôi chỉ hiển thị 200 mỗi trang. Tôi có chạy cái này không?

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

Hoặc này:

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

là phương pháp .Query<T> Dapper của hoãn lại hay không?

Trả lời

8

Bạn nên sử dụng SELECT TOP n....

Phương thức Query<T> có thông số tùy chọn bool buffered = true, khi vòng lặp thực sự thông qua kết quả đầy đủ, hãy đọc từng hàng vào một List<T>. Bạn có thể làm cho tham số này sai và kết quả là IEnumerable<T> sẽ bị "trì hoãn" theo nghĩa là truy vấn db sẽ không được thực hiện cho đến khi bạn sử dụng nó và các hàng sẽ được truy lục từ phía "từng người một" IDataReader.Read trên mỗi lần lặp).

Vì vậy, có, nó có thể được "trì hoãn". BAO GIỜ, bạn vẫn nên sử dụng TOP n vì nếu không, bạn vẫn sẽ thực thi và chuẩn bị resultset cho 10000 bản ghi ở phía bên db, mặc dù bạn chỉ có thể vận chuyển n hàng đầu tiên của các khách hàng đó.

Các vấn đề liên quan