2016-03-03 76 views
1

我有此代碼..問題的LINQ跳過採取

 var documents = from d in db.Documents select d; 
     documents = documents.OrderBy(d => d.Created); 
     documents = documents.Skip(20).Take(10); 

在DB I具有25頁的文檔(IDS從1到25)。當我運行這段代碼我從19號文件到24

如果我把它寫這樣

documents = documents.Skip(20); 

或類似這樣的

documents = documents.Skip(20).ToList().Take(10).AsQueryable(); 

我從ID 20到25的文件。 。

我在這裏失蹤?

+5

當您談論「文檔19至24」時,您是使用基於0的索引還是基於1的索引?你能展示一個[mcve]嗎? (另外,你的代碼很難理解,我會使用'var actualPage = page ?? 1; var actualPageSize = pageSize ?? 10; var skip =(actualPage - 1)* actualPageSize; documents = documents .Skip(skip).Take(actualPageSize);'...並且可能驗證你沒有得到負面的輸入,我也使用返回值而不是接受'文檔'的參考... –

+2

在這個點,它看起來像是一個破碎的提供者 - 或者數據不是你認爲的那樣。你看看生成的SQL嗎?(請注意,你不是通過Id命令,它可能會解釋它...) –

+0

什麼是跳過?在「如果我這樣寫」部分 – Thorarins

回答

1

您的數據不是你的想法。問題是id=25中的created日期不正確。

+0

在過去的6個文檔中創建的日期相同...也許這是一個問題? – Pavol

+0

這樣做也是如此。 –

+0

如果您通過重複數據進行排序,您可能需要按順序排列兩個字段。爲主鍵添加'.ThenBy(...)'。 –

0

您首先在created處訂購您的序列,那麼您爲什麼會期望輸出的訂購(或選擇基於)id

做好Skip第一和OrderBy秒改變輸出,因爲它可能是由Id下令開始,然後你把序列中的最後幾,然後按日期再次下令。