The LINQ to SQL query in the function below causes a StackOverflowException during run-time. What do I need to do to resolve this? I don't think it's an infinite loop problem - I think I just need to reduce the call stack?
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
It took me a long time to track the cause of the issue down, and I've tried taking calls to GetUserId
outside of query and replacing AndAlso
with And
and OrElse
with Or
with no luck.
I think I need to re-write this query with something more efficient and any advice on how to do this is very welcome.
UPDATE
Call Stack captured via Crash Dump analysed in Debug Diagnostic Tool (not sure if I have pasted the correct thing here):
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)
I must admit it looks like infinite loop - bit this is a bit beyond me atm!
UPDATE
Below cut-down query is still causing a 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
Tried the following query with no luck - thought it would be more efficient but still causes a 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
I'm surprised that the current code is causing a stack overflow, but even if it weren't it couldn't work. Currently you're calling your local method from within your query: that's not going to work, as it can't be converted into SQL.
Instead, I suggest you call the method before your query, storing the result as a local variable - then use that variable where you were calling it in the query:
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
See more on this question at Stackoverflow