使用 Skip 和 Take 在第一页后返回错误结果的 Linq 分页

Linq Paging using Skip and Take returning wrong result after first page

我们有一个实现分页的jquery.jtable页面。我们注意到分页功能不正常。例如,如果总共有 17 个项目,则第一页正确显示 10,第二页正确显示 7。但是,如果总共有 20 个项目,则第一页显示 10,第二页仅显示 8。 我们正在使用:

return myQuery.Skip(startIndex).Take(pageSize).ToList()

在第二页上,startindex = 10,页面大小 = 10,正如我上面所说,它只有 returning 8。罪魁祸首似乎是 .Take。我在代码上方放置了一个 if 语句,其中包含:

       if (myQuery.Skip(startIndex).ToList().Count() <= pageSize)
       {
          return myQuery.Skip(startIndex).ToList();
       }

在第二遍中,如果 return 为真,因为计数和页面大小都是 10。这里的 return 确实 return 第二遍的所有 10 行页。我担心的是,如果完整的 myQuery 集很大,这可能会导致资源问题。幸运的是,这个特定的 table 包含一个小行数。

有没有其他人遇到过这个问题并找到了更好的解决方案?

你派生 startIndex 的方式一定是罪魁祸首。试试这个:

return myQuery.Skip((pageNumber - 1 ) * pageSize).Take(pageSize).ToList();

编辑:

并确保 pageNumber 永远不会超过最大可能的页码。

var maxPages = maxRecords / pageSize + (maxRecords % pageSize > 0 ? 1 : 0);

例如,您有一个方法可以只检索特定页面所需的记录:

public List<SomeEntity> GetSomeEntityForPage(int pageNumber, int pageSize)
{
    return myQuery.Skip((pageNumber - 1 ) * pageSize).Take(pageSize).ToList(); 
}