2013-10-15 46 views
0

下面的函數中的LINQ to SQL查詢在運行時導致StackOverflowException。我需要做什麼來解決這個問題?我不認爲這是一個無限循環問題 - 我想我只需要減少調用堆棧?導致StackOverflowException的LINQ to SQL查詢

Public Shared Function AddFilters_Current(ByVal query As IQueryable(Of UserChecklistItem)) As IQueryable(Of UserChecklistItem) 

    Return From r In query Where 
      ((r.UserChecklist.UserId = GetUserId() AndAlso Not r.UserChecklist.DelegationUserId.HasValue) OrElse 
      (r.UserChecklist.DelegationUserId.HasValue AndAlso r.UserChecklist.DelegationUserId = GetUserId())) AndAlso 
      Not r.UserChecklist.Completed AndAlso 
      r.UserChecklist.DateActive <= Date.Today AndAlso 
      (Not r.UserChecklist.DateInactive.HasValue OrElse r.UserChecklist.DateInactive > Date.Today) 
      Order By r.UserChecklistId Ascending, r.Weight Descending, r.Id Ascending 
      Select r 

End Function 

Public Function GetUserId() As Integer 
    Dim sv As Object = HttpContext.Current.Session.Item("UserId") 
    If Not TypeOf sv Is Integer Then Return Nothing 
    Return DirectCast(sv, Integer) 
End Function 

我花了很長的時間來跟蹤問題的原因了,我已經試過採取調用GetUserId外查詢,並與AndOrElseOr沒有運氣更換AndAlso

我想我需要用更有效率的東西來重寫這個查詢,任何有關如何做到這一點的建議都非常受歡迎。

UPDATE

調用堆棧通過碰撞捕獲在調試診斷工具轉儲分析(不知道我在這裏貼上了正確的事):

NET Call Stack 

Function 
DomainNeutralILStubClass.IL_STUB_PInvoke(System.RuntimeTypeHandle, System.Runtime.CompilerServices.ObjectHandleOnStack) 
System.RuntimeTypeHandle.GetGenericTypeDefinition(System.RuntimeTypeHandle, System.Runtime.CompilerServices.ObjectHandleOnStack) 
System.RuntimeType.GetGenericTypeDefinition() 
System.Data.Linq.SqlClient.SqlTypeSystem+Sql2008Provider.From(System.Type, System.Nullable`1) 
System.Data.Linq.SqlClient.SqlTypeSystem+ProviderBase.From(System.Type) 
System.Data.Linq.SqlClient.SqlTypeSystem+ProviderBase.From(System.Object) 
System.Data.Linq.SqlClient.SqlFactory.ValueFromObject(System.Object, System.Type, Boolean, System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitConstant(System.Linq.Expressions.ConstantExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 

... cut for brevity ... 

System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitWhere(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitOrderBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitThenBy(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlOrderType) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSelect(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.VisitAggregate(System.Linq.Expressions.Expression, System.Linq.Expressions.LambdaExpression, System.Data.Linq.SqlClient.SqlNodeType, System.Type) 
System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(System.Linq.Expressions.MethodCallExpression) 
System.Data.Linq.SqlClient.QueryConverter.VisitInner(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(System.Linq.Expressions.Expression) 
System.Data.Linq.SqlClient.SqlProvider.BuildQuery(System.Linq.Expressions.Expression, System.Data.Linq.SqlClient.SqlNodeAnnotations) 
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(System.Linq.Expressions.Expression) 
System.Data.Linq.DataQuery`1[[System.__Canon, mscorlib]].System.Linq.IQueryProvider.Execute(System.Linq.Expressions.Expression) 
System.Web.Query.Dynamic.DynamicQueryable.Count(System.Linq.IQueryable) 
System.Web.UI.WebControls.DynamicQueryableWrapper.Count(System.Linq.IQueryable) 
System.Web.UI.WebControls.QueryableDataSourceView.ExecutePaging(System.Linq.IQueryable, System.Web.UI.WebControls.QueryContext) 
System.Web.UI.WebControls.QueryableDataSourceView.ExecuteQuery(System.Linq.IQueryable, System.Web.UI.WebControls.QueryContext) 
System.Web.UI.WebControls.LinqDataSourceView.ExecuteSelect(System.Web.UI.DataSourceSelectArguments) 
System.Web.UI.DataSourceView.Select(System.Web.UI.DataSourceSelectArguments, System.Web.UI.DataSourceViewSelectCallback) 
System.Web.UI.WebControls.DataBoundControl.PerformSelect() 
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() 
System.Web.UI.WebControls.GridView.DataBind() 
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() 
System.Web.UI.WebControls.GridView.OnPreRender(System.EventArgs) 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Control.PreRenderRecursiveInternal() 
System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean) 
System.Web.UI.Page.ProcessRequest(Boolean, Boolean) 
System.Web.UI.Page.ProcessRequest() 
System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext) 
System.Web.UI.Page.ProcessRequest(System.Web.HttpContext) 
ASP.dynamicdata_pagetemplates_listdetails_aspx.ProcessRequest(System.Web.HttpContext) 
System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef) 
System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception) 
System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext, System.AsyncCallback, System.Object) 
System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest) 
System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest) 
System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32) 
DomainNeutralILStubClass.IL_STUB_COMtoCLR(Int32, Int32, IntPtr) 

我必須承認,它看起來像死循環 - 這有點超出我的意思!

UPDATE

以下刪節查詢仍在造成StackOverflowException:

Return From r In query Where 
     r.UserChecklist.DateActive <= Date.Today AndAlso 
     (Not r.UserChecklist.DateInactive.HasValue OrElse r.UserChecklist.DateInactive > Date.Today) 
     Order By r.UserChecklistId Ascending, r.Weight Descending, r.Id Ascending 
     Select r 

UPDATE

試過,沒有運氣下面的查詢 - 認爲這將是更有效但仍然會導致StackOverflowException。

Dim userId As Integer = GetUserId() 
Dim today As Date = Date.Today 

Return From r In query Where 
     If(Not r.UserChecklist.DateInactive.HasValue, True, r.UserChecklist.DateInactive > today) 
     Order By r.UserChecklistId Ascending, r.Weight Descending, r.Id Ascending 
     Select r 
+1

堆棧跟蹤是什麼樣的? –

+1

我的經驗法則是,如果謂詞的深度或深度超過2或3,則將其作爲存儲過程編寫。 – asawyer

+0

@JonSkeet上面粘貼的堆棧跟蹤謝謝 –

回答

1

我很驚訝,當前的代碼導致堆棧溢出,但即使它不是無法工作。目前,您正在查詢中調用本地方法:這不會起作用,因爲它無法轉換爲SQL。

相反,我建議你調用該方法查詢之前,存儲結果作爲一個局部變量 - 然後使用該變量你在哪裏查詢調用它:

Public Shared Function AddFilters_Current(ByVal query As IQueryable(Of UserChecklistItem)) As IQueryable(Of UserChecklistItem) 

    Dim userId = GetUserId() 
    Return From r In query Where 
     ((r.UserChecklist.UserId = userId AndAlso Not r.UserChecklist.DelegationUserId.HasValue) OrElse 
     (r.UserChecklist.DelegationUserId.HasValue AndAlso r.UserChecklist.DelegationUserId = userId)) AndAlso 
     Not r.UserChecklist.Completed AndAlso 
     r.UserChecklist.DateActive <= Date.Today AndAlso 
     (Not r.UserChecklist.DateInactive.HasValue OrElse r.UserChecklist.DateInactive > Date.Today) 
     Order By r.UserChecklistId Ascending, r.Weight Descending, r.Id Ascending 
     Select r 

End Function 
+0

感謝喬恩 - 我顯然沒有做正確的事情我會嘗試你的解決方案,但它不能單獨存在,因爲我在很多地方都這樣做,並且它可以工作。我將在建立/測試一個新的WHERE子句時嘗試您的建議,我應該能夠進一步縮小它,因爲我將逐步構建它,並進行測試。 –

+0

@ChrisCannon:我相信你真的*不*在LINQ to SQL查詢中這樣做。您可以在LINQ to Objects中執行此操作,但是您無法在LINQ to SQL查詢中調用任意方法。 –

+0

嗯,我相信你,但相信我的代碼可以在其他地方使用。作爲QueryExtender的一部分,此代碼正在被MethodExpression使用,它會改變什麼嗎? –

0

我做了我的代碼逐步笨直到下面的工作:

Public Shared Function AddFilters_Current(ByVal query As IQueryable(Of UserChecklistItem)) As IQueryable(Of UserChecklistItem) 

    Dim l As New List(Of UserChecklistItem) 

    For Each i As UserChecklistItem In query 

     If ((i.UserChecklist.UserId = GetUserId() AndAlso Not i.UserChecklist.DelegationUserId.HasValue) OrElse 
      (i.UserChecklist.DelegationUserId.HasValue AndAlso i.UserChecklist.DelegationUserId = GetUserId())) AndAlso 
      Not i.UserChecklist.Completed AndAlso 
      i.UserChecklist.DateActive <= Date.Today AndAlso 
      (Not i.UserChecklist.DateInactive.HasValue OrElse i.UserChecklist.DateInactive > Date.Today) Then 

      l.Add(i) 

     End If 

    Next 

    Return From r In l.AsQueryable Order By r.UserChecklistId Ascending, r.Weight Descending, r.Id Ascending Select r 

End Function 

現在的問題是應用程序有點慢!

+0

是的,你真的不想這樣做 - 並注意調用'AsQueryable'在這裏根本沒有幫助你。你可以嘗試的一件事就是使用與前面相同的'Where'子句(在我的答案中應用更改之後)提取所有結果,以構建一個List(Of UserChecklistItem)',然後僅應用排序。然後至少你會在數據庫中完成過濾。 –

+0

哦,不,我剛剛發現我的代碼出了什麼問題 - 這真的很尷尬,如果我已經正確調試了它,那麼我會在之前找到它,即繼續調用堆棧。我只需要使用'If Not IsPostBack Then ...'我應該怎樣處理這個SO頁面的混亂? –

+0

哇,我不明白爲什麼會導致堆棧溢出,但我很高興它被分類。恩,可能會投票自己關閉它並編輯問題以表明發生了什麼? –