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

时间:2009-04-27 14:21:59

标签: c# linq linq-to-sql pagination

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

我有以下情况:

假设我想通过 description 搜索 items 表。我很容易做到:

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

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

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

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

2 个答案:

答案 0 :(得分: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);
}

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

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

int numberOfPages = (int)(totalCount/pageSize);

根据您显示记录的方式,您可以使用numberOfPages显示“Y页面X”的导航栏...第1页,共10页等。

答案 1 :(得分:2)

您可以使用Take extension方法:

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount)
{
   return from item in _dc.Items
          where item.Description.Contains(description).Take(resultAmount);
}

您可以更进一步,并使用Skip进行后续“页面”:

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount, int page)
{
   return from item in _dc.Items
          where item.Description.Contains(description).Skip(resultAmount * page).Take(resultAmount);
}