2

aspx ページにコントロールのリピーターがあります。各コントロールの DB に大規模なヒットがあるため、クエリをコントロールから親ページに移動しようとしています。問題は、次のエラーが発生することです。

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 子オブジェクトを持つアクティビティ オブジェクトを送信する必要があります。

このオブジェクトを作成しようとしましたが、次のエラーが発生しました。

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})

解決:

@kristoferAのアドバイスに従い、次のことを行いました

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
4

3 に答える 3

1

いくつかの関連付けを怠惰にロードしているように聞こえます。

遅延読み込みをオフにし (dc.DeferredLoadingEnabled = false)、DataLoadOptions オブジェクトを dc.LoadOptions に渡して、何を一括読み込みするかを DC に指示します。

于 2012-05-24T11:20:09.030 に答える
0

ai.farfa は ToList() で正しいです。これが、実際のクエリをトリガーする呼び出しです。ただし、この行で行う必要があると思います:

 grdSelectedActivities.DataSource = lnqRoundActivities.ToList()
于 2012-05-24T11:07:12.700 に答える
0

PopulatePage() が完了した後にdbContextが破棄され、Linq 選択の戻り値の型が IEnumerable(Of Activity) であるとゲストは思いますが、これは準備された SQL ステートメントです。

試す..

_activityList = activityList.ToList()//.AsEnumerable()

編集

モデルがステートレスの場合、新しい 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
于 2012-05-24T11:01:22.293 に答える