22

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

我有以下情况:

假设我想按description搜索items表。我可以轻松做到:

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

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

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

是否有用于执行此操作的LINQ to SQL通用模式?

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

4

2 回答 2

33

分页模式非常简单。它涉及使用 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);
}

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

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

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

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

于 2009-04-27T14:35:22.740 回答
1

您可以使用 Take 扩展方法:

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);
}
于 2009-04-27T14:29:22.710 回答