在会话中存储Linq查询

时间:2013-03-11 13:51:44

标签: c# asp.net linq

我想在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事件中使用

3 个答案:

答案 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();
}