public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { if (Expression is QueryShaperExpression queryShaperExpression) { if (queryShaperExpression.QueryExpression is DocumentQueryExpression documentQueryExpression) { var selectExpression = documentQueryExpression.SelectExpression; var sqlTranslatingExpressionVisitor = new SqlTranslatingExpressionVisitor( selectExpression, QueryCompilationContext); var sqlPredicate = sqlTranslatingExpressionVisitor.Visit(whereClause.Predicate); if (sqlTranslatingExpressionVisitor.Translated) { selectExpression.AddToPredicate(sqlPredicate); return; } } if (AllMembersBoundToJObject) { var fromClause = queryModel.MainFromClause; var previousParameterType = CurrentParameter.Type; // Temporarily change current parameter to JObject to try binding to it without materializing the entity UpdateCurrentParameter(fromClause, typeof(JObject)); var predicate = ReplaceClauseReferences(whereClause.Predicate); if (AllMembersBoundToJObject) { Expression = new QueryShaperExpression( QueryCompilationContext.IsAsyncQuery, Expression.Call( LinqOperatorProvider.Where.MakeGenericMethod(CurrentParameter.Type), queryShaperExpression.QueryExpression, Expression.Lambda(predicate, CurrentParameter)), queryShaperExpression.Shaper); if (CurrentParameter.Type == typeof(JObject)) { UpdateCurrentParameter(fromClause, previousParameterType); } return; } UpdateCurrentParameter(fromClause, previousParameterType); } } base.VisitWhereClause(whereClause, queryModel, index); }
public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { Debug.Assert(Expression is QueryShaperExpression, "Invalid Expression encountered"); var queryShaperExpression = (QueryShaperExpression)Expression; if (queryShaperExpression.QueryExpression is DocumentQueryExpression documentQueryExpression) { var selectExpression = documentQueryExpression.SelectExpression; var sqlTranslatingExpressionVisitor = new SqlTranslatingExpressionVisitor( selectExpression, QueryCompilationContext); var sqlPredicate = sqlTranslatingExpressionVisitor.Visit(whereClause.Predicate); if (sqlPredicate != null) { selectExpression.AddToPredicate(sqlPredicate); return; } } var fromClause = queryModel.MainFromClause; // Change current parameter to JObject UpdateCurrentParameter(fromClause, typeof(JObject)); var predicate = ReplaceClauseReferences(whereClause.Predicate); Expression = new QueryShaperExpression( Expression.Call(LinqOperatorProvider.Where.MakeGenericMethod(CurrentParameter.Type), queryShaperExpression.QueryExpression, Expression.Lambda(predicate, CurrentParameter)), queryShaperExpression.Shaper); UpdateCurrentParameter(fromClause, Expression.Type.TryGetSequenceType()); //base.VisitWhereClause(whereClause, queryModel, index); }