2016-03-03 63 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下令开始,然后你把序列中的最后几,然后按日期再次下令。