2011-08-03 18 views
1

我在ASP.NET 2.0中有一個Web應用程序,我需要在其中進行分頁。我的數據訪問方法是從數據庫調用中取出一個DataSet,然後將其轉換爲List<Foo>(其中Foo是我的類型,我正在從數據庫中取出)並將其綁定到GridView。我之所以這樣做,是因爲我不想通過應用程序在DataTable上使用字符串索引器,並且可以通過在我的類上實現顯示邏輯作爲屬性來將顯示邏輯從數據庫中分離出來。這也意味着我在.NET中進行排序而不是SQL。排序時在ASP.NET 2.0中有效的自定義分頁

實現分頁,然後,我需要把所有Foo從數據庫中,對列表進行排序,然後拿我想要的東西出來的完整列表,以顯示:

List<Foo> myFoo = MyDB.GetFoos(); 
myFoo.Sort(new Foo.FooComparer()); 
List<Foo> toDisplay = new List<Foo>(); 
for (int i = pageIndex * pageSize; i < (pageIndex + 1) * pageSize && i < myFoo.Count; i++) 
{ 
    toDisplay.Add(myFoo[i]); 
} 
//bind grid 

有了足夠的元素,這成爲延誤的來源;在我的開發機器連接到測試數據庫時,從數據庫中拉出5000條記錄時,在屏幕上綁定一個網格需要將近0.5秒的時間。

爲了解決這個問題,我將不得不將所有的顯示邏輯移動到SQL,以便排序和分頁可以在那裏進行,或者有更好的方法嗎?

另外,Linq to SQL解決這個問題嗎?如果我通過在我的.NET類中實現的自定義屬性進行排序,然後使用.Skip(pageIndex * pageSize).Take(pageSize),它是否會將其轉換爲SQL,如this question中所述?

回答

0

Linq to SQL將使用文章中描述的Row_Number方法,並且通常它會對數據庫執行高效的分頁查詢。

但是,SQL可以爲您指定的數據量仍然有限,並且仍然具有高性能。

如果您有一個包含數百萬或行的表格,分頁函數需要限制查詢的數據量,然後使用Row_Number方法分頁。

這麼說吧,你想頁面此查詢:

Select column1, column2, column3 from table1 where column1 > 100 

現在,讓我們說,返回1,000,000行。 SQL Server仍然需要運行超過一百萬行的分頁例程。這將花費幾秒鐘的時間來分頁結果集的初始查詢。它必須爲每個查詢執行此操作。

爲了確保性能得以保持,您需要限制SQL將返回的記錄數量。

Select TOP 10000 column1, column2, column3 from table1 where column1 > 100 

現在,儘管100萬條記錄匹配查詢,只有10000會被保存,這將加快東西亞秒響應。在這種情況下,應該通知用戶他們跑到數據庫的查詢過於寬泛,他們需要縮小搜索條件,因爲並非所有可能的結果都是結果。