private static Expression HandleAll(HandlerContext handlerContext) { var filteringVisitor = new FilteringExpressionTreeVisitor(handlerContext.QueryModelVisitor); var predicate = filteringVisitor.VisitExpression( ((AllResultOperator)handlerContext.ResultOperator).Predicate); if (!filteringVisitor.RequiresClientEval) { var innerSelectExpression = new SelectExpression(); innerSelectExpression.AddTables(handlerContext.SelectExpression.Tables); innerSelectExpression.Predicate = Expression.Not(predicate); SetProjectionCaseExpression( handlerContext, new CaseExpression(Expression.Not(new ExistsExpression(innerSelectExpression)))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient); }
public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { base.VisitWhereClause(whereClause, queryModel, index); foreach (var sourceQuery in _queriesBySource) { var filteringVisitor = new FilteringExpressionTreeVisitor(this, sourceQuery.Key); sourceQuery.Value.Predicate = filteringVisitor.VisitExpression(whereClause.Predicate); } }
public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { var previousExpression = Expression; var projectionCounts = _queriesBySource .Select(kv => new { SelectExpression = kv.Value, kv.Value.Projection.Count }) .ToList(); _requiresClientFilter = !_queriesBySource.Any(); base.VisitWhereClause(whereClause, queryModel, index); foreach (var selectExpression in _queriesBySource.Values) { var filteringVisitor = new FilteringExpressionTreeVisitor(this); selectExpression.Predicate = filteringVisitor.VisitExpression(whereClause.Predicate); _requiresClientFilter |= filteringVisitor.RequiresClientEval; } if (!_requiresClientFilter) { foreach (var projectionCount in projectionCounts) { projectionCount.SelectExpression .RemoveRangeFromProjection(projectionCount.Count); } Expression = previousExpression; } }
public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index) { var previousQuerySource = index == 0 ? queryModel.MainFromClause : queryModel.BodyClauses[index - 1] as IQuerySource; var previousSelectExpression = previousQuerySource != null ? TryGetQuery(previousQuerySource) : null; var previousSelectProjectionCount = previousSelectExpression?.Projection.Count ?? -1; base.VisitJoinClause(joinClause, queryModel, index); if (previousSelectExpression != null) { var selectExpression = TryGetQuery(joinClause); if (selectExpression != null) { var filteringExpressionTreeVisitor = new FilteringExpressionTreeVisitor(this); var predicate = filteringExpressionTreeVisitor .VisitExpression( Expression.Equal( joinClause.OuterKeySelector, joinClause.InnerKeySelector)); if (predicate != null) { _queriesBySource.Remove(joinClause); previousSelectExpression.RemoveRangeFromProjection(previousSelectProjectionCount); var innerJoinExpression = previousSelectExpression .AddInnerJoin( selectExpression.Tables.Single(), QuerySourceRequiresMaterialization(joinClause) ? selectExpression.Projection : Enumerable.Empty <ColumnExpression>()); innerJoinExpression.Predicate = predicate; Expression = new QueryFlatteningExpressionTreeVisitor( previousQuerySource, joinClause, QueryCompilationContext, previousSelectProjectionCount, LinqOperatorProvider.Join) .VisitExpression(Expression); } else { previousSelectExpression.RemoveRangeFromProjection(previousSelectProjectionCount); } } } }