使用LINQ to SQL进行分页搜索结果

Pab*_*ruz 21 c# linq pagination linq-to-sql

使用LINQ to SQL获取分页结果的最佳模式是什么?

我有以下场景:

假设我想按描述搜索项目表.我可以轻松地做到:

public IQueryable<Item> FindItemsByDescription(string description)
{
   return from item in _dc.Items
          where item.Description.Contains(description);
}
Run Code Online (Sandbox Code Playgroud)

现在,对这个结果集进行分页的最佳方法是什么?

  1. 我应该在执行此操作之前执行计数查询以查找结果集大小,然后根据我的需要限制此查询吗?我觉得这是要走的路.
  2. 我应该执行完整查询,从数组大小中获取计数并仅返回此数组中的分页子集吗?如果结果集足够大,我觉得这会浪费很多时间......或者LINQ to SQL在这里做了些什么?

是否有LINQ to SQL常用模式来执行此操作?

编辑:我必须澄清一件小事.我知道Take和Skip方法.但是,在使用TakeSkip之前,我应该如何获得查询将检索的结果总数

Jos*_*lio 30

分页模式非常简单.它涉及使用Skip()和Take()扩展方法,如下所示:

public IQueryable<Item> FindItemsByDescription(string description, int pageIndex, int pageSize)
{
   return from item in _dc.Items
          where item.Description.
          Contains(description).
          Skip((pageIndex - 1) * pageSize).
          Take(pageSize);
}
Run Code Online (Sandbox Code Playgroud)

更新:要获得总计数,只需使用Count()方法:

int totalCount = from item in _dc.Items
                 where item.Description.
                 Contains(description).Count();

int numberOfPages = (int)(totalCount/pageSize);
Run Code Online (Sandbox Code Playgroud)

根据您显示记录的方式,您可以使用numberOfPages显示导航栏,其中包含"Page X of Y"...第1页,共10页等.

  • "(int)(totalCount/pageSize)"是错误的.假设您有5个项目,页面大小为4?页数将为1而不是2.您还需要测试totalCount%pageSize == 0是否添加另一个单位. (4认同)
  • 对于numberOfPages,我使用了Math.Ceiling方法,比如这个`int numberOfPages =(int)Math.Ceiling((double)totalCount/pageSize);` (4认同)
  • Pablo - 示例中的代码将执行2个单独的SQL查询.但是,情况并非必须如此.您可以从查询中获取结果并使用ToList()将其放入列表中,然后从中获取Count().这样你最终只能调用一次数据库. (3认同)