2009-04-27 176 views
21

LINQ to SQL得到分页结果的最佳模式是什么?用LINQ to SQL分页搜索结果

我有以下情形:

假设我想描述搜索项目表。我可以很容易地做到:

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

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

  1. 我应该这样做是为了找出结果集的大小,然后按照我想要的限制此查询之前执行计数查询?我觉得这是要走的路。
  2. 我是否应该执行完整查询,从数组大小中获取计数并仅返回此数组中的分页子集?如果结果足够大,我觉得这会浪费大量时间......或者是在这里做一些魔术?

是否有LINQ to SQL执行此操作的常见模式?

编辑:我必须澄清一件小事。我意识到Take和Skip方法。但是,在使用跳过,我该如何得到总计数查询结果会检索?

回答

30

寻呼机的模式是非常简单的。它涉及使用跳过(中)和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来显示一个导航栏的“页面X的Y”......第1页,共10页等。

+0

Pablo - 我更新了我的文章,包括更多关于分页的信息。 (Salu2) – 2009-04-27 14:47:35

2

可以使用采取扩展方法:

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

您可以进一步采取这一步骤,然后使用跳过随后的“页面”:

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); 
} 
+0

非常感谢您的快速回答。我知道Take和Skip方法exitence。但是,如果我真的想分页,我必须知道没有分页的结果总数是多少。那么,获得*总数*的最佳方法是什么? – 2009-04-27 14:35:42