如何强制linq到Sql直接执行查询

时间:2012-05-24 09:51:39

标签: asp.net linq-to-sql

我在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

3 个答案:

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