0

我需要从数据库中传递一些结果。我没有传递整个数据集或构造的 sql 查询,而是尝试传递 LinqDataSource 配置的对象。

在源页面上,我使用用户在页面上显示的控件(搜索框、组合框等)上设置的值来配置 LinqDataSource 对象属性WhereWhereParameters 。我传递对象以避免接收器页面上的 LinqDataSource 重新配置。

但是,即使它在我的开发系统上运行良好,在将它部署到专用服务器上后,我收到一条错误消息,提示如下:

无法访问已处置的对象。

对象名称:“Dispose 后访问的 DataContext。”。

在源页面和接收者页面上,LinqDataSource 对象都声明为:

<asp:LinqDataSource ID="myLinqDS" runat="server" 
    ContextTypeName="MyProject.MyDBNamedpace.MyDataContext" 
    TableName="TheTable"
    OrderBy="field1, field2"
</asp:LinqDataSource>

要传递数据源对象,我这样做:

SetLinqDataSourceWhereAndHisParameters(); //just set Where and WhereParameters
Guid guid = Guid.NewGuid();
Session[guid.ToString()] = myLinqDS;
ScriptManager.RegisterStartupScript(this.Page,
    typeof(Page),
    "Redirect",
    String.Format(@"window.open(""{0}"");",
        this.ResolveClientUrl("~/PageToDisplayTheData.aspx?guid=" +
        System.Web.HttpUtility.UrlEncode(guid.ToString())
    ),
true);

并在 PageToDisplayTheData.aspx 的代码隐藏中检索:

myLinqDS =
   (LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];
aDataList.DataSource = myLinqDS;
aDataList.DataBind();
4

3 回答 3

2

应该将 DataContext 存储在 Session (或任何地方)中,原因如下:

  • DataContext 不是线程安全的
  • DataContext 被设计为一个工作单元工具

如果您在 DataContext 中查询一个集合,它会在内部缓存,因此当您重新查询它时,您不会往返于数据库。但这可能导致数据停滞,因为这些值不能反映底层数据库的实际状态。

于 2009-01-20T08:24:24.873 回答
0

你的目标是什么?如果您想让应用程序不必返回数据库,那么无论如何您都需要缓存整个数据集。如果您只是想不必重新创建查询,为什么不将查询作为一种方法添加到您的数据上下文中并从那里到处引用它。

public partial class MyDataContext
{
    public Table<MyTable> OrderedTable()
    {
         return this.TheTable.OrderBy( t => t.field1 )
                             .ThenBy( t => t.field2 );
    }
}
于 2009-01-19T15:53:38.790 回答
0

只需将属性从一个对象复制到另一个对象即可:

LinqDataSource received=
(LinqDataSource)Session[System.Web.HttpUtility.UrlDecode(Request.QueryString[guid])];

myLinqDS.Where = received.Where;
foreach (Parameter p in received.WhereParameters)
    myLinqDS.WhereParameters.Add(p);

但我仍然不知道为什么它可以在 VS2008 内部 Web 服务器上运行,但不能在运行 IIS 的主服务器上运行。

于 2009-01-19T17:44:26.693 回答