【问题标题】:problems with Linq skip takeLinq 跳过的问题
【发布时间】:2016-03-03 09:24:54
【问题描述】:

我有这个代码..

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

在 db 中,我有 25 个文档(ID 从 1 到 25)。当我运行此代码时,我会从 id 19 到 24 获取文档。

如果我这样写

    documents = documents.Skip(20);

或者像这样

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

我从 id 20 到 25 获取文档..

我在这里缺少什么??

【问题讨论】:

  • 当您谈论“文档 19 到 24”时,您使用的是基于 0 的索引,还是基于 1 的索引?你能显示minimal reproducible example吗? (顺便说一句,您的代码很难理解。我会使用 var actualPage = page ?? 1; var actualPageSize = pageSize ?? 10; var skip = (actualPage - 1) * actualPageSize; documents = documents.Skip(skip).Take(actualPageSize);... 之类的东西,并且可能会验证您没有得到负输入。我也会使用返回值而不是接受 @ 987654326@ 参考...
  • 此时,它看起来像是一个损坏的提供程序 - 或者数据不是您认为的那样。你看过生成的 SQL 吗? (请注意,您不是按 ID 排序的,这可能可能解释它...)
  • skip的值是多少?在“如果我这样写”部分
  • 忘记最后一行,你永远不会创建一个 .ToList() 然后再次开始查询相同的信息。第一行,文档 skip(20) 确实是你告诉我的,它跳过前 20 个并给你剩下的,在你的情况下是 20-25
  • 是的,那为什么当我使用这个文档时。Skip(20).Take(10) 我得到不同的文档?

标签: c# linq entity-framework-6


【解决方案1】:

您的数据不是您想的那样。问题是id=25 中的created 日期不正确。

【讨论】:

  • 最近 6 个文档中的创建日期相同...也许这是个问题?
  • 这样也行。
  • 如果您按重复数据排序,您可能需要按顺序排列两个字段。为主键添加.ThenBy(...)。
【解决方案2】:

您首先按created 对您的序列进行排序,那么为什么您希望输出按id 排序(或基于选择)?

首先执行Skip,然后执行OrderBy 更改了输出,因为它最初可能是由Id 排序的,然后您取序列中的最后几个,然后再次按日期排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多