我在aspx页面上有一个控制器转发器。我试图将一个查询移出控件并进入父页面,因为每个控件的数据库都有大量命中。问题是我收到以下错误。
Cannot access a disposed object.
Object name: 'DataContext accessed after Dispose.'.
我不明白这一点,因为我认为做.ToList()会强制执行查询
我在父页面中的代码
Private _activityList As IEnumerable(Of Activity)
Public ReadOnly Property ActivityList() As IEnumerable(Of Activity)
Get
Return _activityList
End Get
End Property
Sub PopulatePage()
Dim activityList = From a In dbContext.Activities Where a.PA.PA_Key.ToUpper().Trim() = "DCC" _
Select a
_activityList = activityList.AsEnumerable()
End Sub
我控制的代码是:
Public _activityList As List(Of Activity)
Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
_activityList = CType(Me.Page, ParentPage).ActivityList.ToList()
End Sub
Sub grdSelectedActivities_NeedDataSource(ByVal source As Object, ByVal e As Telerik.WebControls.GridNeedDataSourceEventArgs) Handles grdSelectedActivities.NeedDataSource
Dim lnqActivities = _activityList
Dim objActivity As Activity = (From x In lnqActivities Where x.AC_Code = ActivityCode Select x).Single
Dim lnqRoundActivities = (From roundactivity In objActivity.RoundActivities Where roundactivity.RA_DS_Code = DepartmentalSettingsCode
Select roundactivity Order By roundactivity.RA_Name)
grdSelectedActivities.DataSource = lnqRoundActivities
End Sub
修改
我认为这是失败的,因为它试图在grdSelectedActivities_NeedDataSource
控制方法中获得RoundActivities。因此,我需要发送一个具有RoundActivityies子对象的Activities对象。
我尝试创建此对象但出现以下错误:
Explicit construction of entity type 'Activity' in query is not allowed.
enter code here
这是更新的代码:
Dim activityList = (From a In dbContext.Activities Where a.PA.PA_Key.ToUpper().Trim() = "DCC" Select New Activity With {.AC_Code = a.AC_Code, .RoundActivities = a.RoundActivities})
解决方案:
我按照@kristofer的建议做了以下
Dim loadOptions = New DataLoadOptions()
loadOptions.LoadWith(Of Activity)(Function(a As Activity) a.RoundActivities)
loadOptions.AssociateWith(Of Activity)(Function(a As Activity) a.RoundActivities.Where(Function(z) If(z.RA_DS_Code = departmentCode, False)))
dataContext.LoadOptions = loadOptions
答案 0 :(得分:1)
听起来你很懒,加载一些关联。
关闭延迟加载(dc.DeferredLoadingEnabled = false),并将DataLoadOptions对象传递给dc.LoadOptions,以指示DC您想要加载的内容。
答案 1 :(得分:0)
我认为 dbContext 在PopulatePage()完成后被释放,你的Linq select返回类型是IEnumerable(Of Activity),它只是一个准备好的SQL语句。
尝试..
_activityList = activityList.ToList()//.AsEnumerable()
如果你的Model是无状态的,你可以创建新的dbContext然后枚举并处理它。
Using db As New dbContext()
Dim activityList = (From a In dbContext.Activities Where a.PA.PA_Key.ToUpper().Trim() = "DCC" _
Select a).ToList()
_activityList = activityList.ToList()
End Using
答案 2 :(得分:0)
ai.farfa与ToList()是正确的。这是触发实际查询的调用。 我想你应该在这条线上做到这一点:
grdSelectedActivities.DataSource = lnqRoundActivities.ToList()