2013-10-19 62 views
7

當我在Dapper中執行查詢並且只想檢索一個記錄塊時,我可以使用.Skip()。Take(),還是我需要在SQL中使用select top n *?Dapper的IEnumerable <T>是否延期或立即執行?

例如給定一張有10,000條記錄的表格,我只希望前200個,因爲我的列表頁面只顯示每頁200個。我運行這個嗎?

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

或者這樣:

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

短小精悍的.Query<T>方法推遲或不?

回答

8

您應該使用SELECT TOP n...

Query<T>方法有一個可選參數bool buffered = true,當真循環遍歷整個結果集時,讀取每行到List<T>。你可以使這個參數爲false,並且得到的IEnumerable<T>將被「延遲」,因爲直到你使用db查詢纔會被執行,並且這些行將從數據庫端「一次一個」地被調用(調用每次迭代時爲IDataReader.Read)。

所以,是的,它可以被「推遲」。但是,你仍然應該使用TOP n,因爲否則你仍然會執行和準備結果集在數據庫端的10000條記錄,儘管你可能只將這些行的前n行傳輸到客戶端。