2009-04-27 257 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