2013-03-11 59 views
0

我試圖將查詢結果存儲在Session中以傳遞給PageIndexChanging事件。在會話中存儲Linq查詢

當我運行查詢時,我得到異常cannot access disposed object

當我綁定網格我加入查詢到 Session

pnl_results.Visible = true; 
ResultsGridView.DataSource = result; 
ResultsGridView.DataBind(); 

Session["ResultQuery"] = result; 

然後我試圖在PageIndexChanging事件

protected void ResultsGridView_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    var gridResult = Session["ResultQuery"].ToString(); 
    ResultsGridView.PageIndex = e.NewPageIndex; 
    ResultsGridView.DataSource = gridResult; 
    ResultsGridView.DataBind(); 
} 

如何設置Session,所以我用它

可以在PageIndexChanging事件中使用它

+0

我不確定在這種情況下確切的最佳做法是什麼,但「ToString」肯定無助於您的情況。 – user7116 2013-03-11 13:55:10

+0

您是否通過調用.ToList()或.FirstOrDefault()等來在您的服務器上執行linq查詢?但我的問題是你的linq查詢在哪裏?我看不到它。 – 2013-03-11 13:55:12

+0

@sixlettervariables不,我不認爲他的結果是一個字符串:) – 2013-03-11 13:55:46

回答

3

保留result.ToList()而不是result

當存儲LINQ查詢的輸出,你實際上是在存儲IEnumerable<T>IQueryable<T>,這只是應該運行查詢的定義。每次迭代結果時,整個查詢都會運行,因此基礎數據(可能是EntityFramework數據上下文)需要可用,這可能不是。通過調用ToList()的結果,您的實現的查詢並緩存結果。現在你有一個對原始查詢一無所知的List<T>。這只是結果的數據。

+0

請記住,如果OP正在更新/更改這些對象,則必須將它們重新連接到L2S上下文。 – user7116 2013-03-11 14:04:59

+0

我只想分頁結果,以便用戶可以選擇結果。哪些已經有效,只是名單太長了。 – StudentRik 2013-03-11 14:08:32

2

我認爲錯誤是你在會話中存儲IQueryable而不是實際的r在存儲結果之前嘗試執行ToList()或類似操作;

0

(T)Session["ResultQuery"]通用喜歡使用請。

使用樣品;

protected void ResultsGridView_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    // var gridResult = Session["ResultQuery"].ToString(); 
    var gridResult = (Product)Session["ResultQuery"]; 
    ResultsGridView.PageIndex = e.NewPageIndex; 
    ResultsGridView.DataSource = gridResult; 
    ResultsGridView.DataBind(); 
}