我需要从数据库中传递一些结果。我尝试传递一个LinqDataSource配置对象,而不是传递整个数据集或构造的SQL查询。
在源页面上,我使用用户在页面上显示的控件上设置的值配置LinqDataSource对象属性其中和 WhereParameters (搜索框,组合盒子等)。我传递了对象以避免在接收器页面上重新配置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();
答案 0 :(得分:2)
您应该不将DataContext存储在Session(或任何地方),原因如下:
如果在DataContext中查询集合,则它在内部进行缓存,因此当您重新查询它时,不会对数据库进行往返。但这可能会导致数据停滞,因为这些值并不反映底层数据库的实际状态。
答案 1 :(得分:0)
你的目标是什么?如果您希望让应用程序不必返回数据库,那么无论如何您都需要缓存整个数据集。如果您只是不必重新创建查询,为什么不将查询作为方法添加到数据上下文中,并从那里随处引用它。
public partial class MyDataContext
{
public Table<MyTable> OrderedTable()
{
return this.TheTable.OrderBy( t => t.field1 )
.ThenBy( t => t.field2 );
}
}
答案 2 :(得分: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内部网络服务器上有效,但在主服务器上没有,运行IIS。