2009-04-08 34 views
0

我有一個包含約10個連接的查詢。使用列表視圖和Linq數據源可以很好地對SQL2008進行頁面處理,但在針對SQL2000運行時無法產生正確的結果。沒有發生異常,但結果顯然不符合規定,有時會返回相同的頁面。通過LINQ Docs閱讀,在SQL2000上不支持對連接查詢進行分頁。夠了,雖然我會預料到一個例外。IQueryable針對SQL 2000與連接尋呼

我現在無法將數據從SQL2000移出。解決方案是做一個完整的查詢,然後執行基於內存的分頁。

protected void LinqDataSourceMain_Selecting(object sender, 
    LinqDataSourceSelectEventArgs e) 
{ 
    // var query = myquery with join... 
    e.Result = query.ToList(); 
} 

現在的問題是:調用ToList()或ToArray()更有效嗎?

AsEnumerable()不能解決問題。用Reflector看擴展方法,它只是返回'源',所以這對我來說很有意義。

e.Result = query.AsEnumerable(); 
public static IEnumerable<TSource> AsEnumerable<TSource>(
    this IEnumerable<TSource> source) 
{ 
    return source; 
} 

但是,以下哪種方法比ToList()或ToArray()更有效?它確實有效,並且推遲執行。

e.Result = query.ToEnumerable(); 

public static IEnumerable<TSource> ToEnumerable<TSource>(
    this IEnumerable<TSource> source) 
{ 
    foreach (var item in source) 
     yield return item; 
} 

回答

3

ToList()會比ToArray()更有效,因爲它並不需要從一個超大緩存做最後的拷貝到一個固定大小的數組。

如果你打算做內存分頁,你不需要延期執行(IMO),因爲你需要獲得物品的計數和隨機存取。您不希望每次都必須重新執行查詢。

+0

謝謝。我需要每次重新查詢,因爲這是一個Web應用程序,我真的不想將結果存儲在臨時位置,如Session。仍然在延期執行的圍欄上? Mybe劈頭髮?最後,我應該能夠脫離sql 2k,但現在不行。 – andleer 2009-04-08 17:06:53

+0

您打算如何計算出要顯示的頁面數量?結果不合理的事實表明,無論你做什麼,都會遇到問題 - 除非可以使排序順序保持一致,否則除非我錯過了某些內容,否則無法合理地進行頁面切換。 – 2009-04-08 17:09:43

+0

當我返回一個列表時,分頁和排序工作正常。當我返回一個IQueryable時它失敗。使用智商,第一頁顯示正確,但事情從那裏開始適用。看一下SQL分析器,SQL實際上是令人討厭的。子查詢通過連接上的子查詢等。 – andleer 2009-04-08 17:20:20