我想在Session
中存储查询结果以传递给PageIndexChanging
事件。
当我运行查询时,我得到异常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 :(得分:3)
保留result.ToList()
代替result
。
当您存储LINQ查询的输出时,实际上存储的是IEnumerable<T>
或IQueryable<T>
,它只是应该运行的查询的定义。每次迭代结果时,整个查询都会运行,因此底层数据(可能是EntityFramework数据上下文)需要可用,这可能不是。通过在结果上调用ToList()
,您实现查询并缓存结果。现在你有一个List<T>
,它对原始查询一无所知。这只是结果的数据。
答案 1 :(得分:2)
我认为错误是您在会话中存储IQueryable而不是实际结果,在存储结果之前尝试执行ToList()或simular;
答案 2 :(得分: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();
}