private static Expression HandleAll(HandlerContext handlerContext) { var sqlTranslatingVisitor = handlerContext.CreateSqlTranslatingVisitor(); PrepareSelectExpressionForAggregate(handlerContext.SelectExpression); var predicate = sqlTranslatingVisitor.Visit( ((AllResultOperator)handlerContext.ResultOperator).Predicate); if (predicate != null) { var innerSelectExpression = handlerContext.SelectExpression.Clone(); innerSelectExpression.ClearProjection(); innerSelectExpression.AddToProjection(Expression.Constant(1)); innerSelectExpression.AddToPredicate(Expression.Not(predicate)); if (innerSelectExpression.Limit == null && innerSelectExpression.Offset == null) { innerSelectExpression.ClearOrderBy(); } SetConditionAsProjection( handlerContext, Expression.Not(new ExistsExpression(innerSelectExpression))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient()); }
private static Expression HandleAll(HandlerContext handlerContext) { var sqlTranslatingVisitor = handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true); var predicate = sqlTranslatingVisitor.Visit( ((AllResultOperator)handlerContext.ResultOperator).Predicate); if (predicate != null) { var innerSelectExpression = handlerContext.SelectExpression.Clone(); innerSelectExpression.ClearProjection(); innerSelectExpression.AddToProjection(Expression.Constant(1)); if (handlerContext.SelectExpression.Predicate != null) { innerSelectExpression.Predicate = Expression.AndAlso( handlerContext.SelectExpression.Predicate, Expression.Not(predicate)); } else { innerSelectExpression.Predicate = Expression.Not(predicate); } if (innerSelectExpression.Limit == null && innerSelectExpression.Offset == null) { innerSelectExpression.ClearOrderBy(); } SetProjectionConditionalExpression( handlerContext, Expression.Condition( Expression.Not(new ExistsExpression(innerSelectExpression)), Expression.Constant(true), Expression.Constant(false), typeof(bool))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient()); }
private static Expression HandleTake(HandlerContext handlerContext) { var takeResultOperator = (TakeResultOperator)handlerContext.ResultOperator; var sqlTranslatingExpressionVisitor = handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true); var limit = sqlTranslatingExpressionVisitor.Visit(takeResultOperator.Count); if (limit != null) { handlerContext.SelectExpression.Limit = takeResultOperator.Count; return(handlerContext.EvalOnServer); } return(handlerContext.EvalOnClient()); }
private static Expression HandleSkip(HandlerContext handlerContext) { var skipResultOperator = (SkipResultOperator)handlerContext.ResultOperator; var sqlTranslatingExpressionVisitor = handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true); var offset = sqlTranslatingExpressionVisitor.Visit(skipResultOperator.Count); if (offset != null) { handlerContext.SelectExpression.Offset = offset; return(handlerContext.EvalOnServer); } return(handlerContext.EvalOnClient()); }
private static Expression HandleGroup(HandlerContext handlerContext) { var sqlTranslatingExpressionVisitor = handlerContext.CreateSqlTranslatingVisitor(); var groupResultOperator = (GroupResultOperator)handlerContext.ResultOperator; var sqlExpression = sqlTranslatingExpressionVisitor.Visit(groupResultOperator.KeySelector); if (sqlExpression != null) { handlerContext.SelectExpression.ClearOrderBy(); var columns = (sqlExpression as ConstantExpression)?.Value as Expression[]; if (columns != null) { foreach (var column in columns) { handlerContext.SelectExpression .AddToOrderBy(new Ordering(column, OrderingDirection.Asc)); } } else { handlerContext.SelectExpression .AddToOrderBy(new Ordering(sqlExpression, OrderingDirection.Asc)); } } var oldGroupByCall = (MethodCallExpression)handlerContext.EvalOnClient(); return(sqlExpression != null ? Expression.Call(handlerContext.QueryModelVisitor.QueryCompilationContext.QueryMethodProvider.GroupByMethod .MakeGenericMethod(oldGroupByCall.Method.GetGenericArguments()), oldGroupByCall.Arguments) : oldGroupByCall); }
private static Expression HandleAll(HandlerContext handlerContext) { var filteringVisitor = handlerContext.CreateSqlTranslatingVisitor(); var predicate = filteringVisitor.Visit( ((AllResultOperator)handlerContext.ResultOperator).Predicate); if (predicate != null) { var innerSelectExpression = handlerContext.SelectExpressionFactory.Create(handlerContext.QueryModelVisitor.QueryCompilationContext); innerSelectExpression.AddTables(handlerContext.SelectExpression.Tables); innerSelectExpression.Predicate = Expression.Not(predicate); if (handlerContext.SelectExpression.Predicate != null) { innerSelectExpression.Predicate = Expression.AndAlso( handlerContext.SelectExpression.Predicate, innerSelectExpression.Predicate); } SetProjectionConditionalExpression( handlerContext, Expression.Condition( Expression.Not(new ExistsExpression(innerSelectExpression)), Expression.Constant(true), Expression.Constant(false), typeof(bool))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient()); }
private static Expression HandleContains(HandlerContext handlerContext) { var filteringVisitor = handlerContext.CreateSqlTranslatingVisitor(); var itemResultOperator = (ContainsResultOperator)handlerContext.ResultOperator; var item = filteringVisitor.Visit(itemResultOperator.Item); if (item != null) { if (item is SelectExpression itemSelectExpression) { var queryCompilationContext = handlerContext.QueryModelVisitor.QueryCompilationContext; var entityType = queryCompilationContext.FindEntityType(handlerContext.QueryModel.MainFromClause) ?? handlerContext.Model.FindEntityType(handlerContext.QueryModel.MainFromClause.ItemType); if (entityType != null) { var outerSelectExpression = handlerContext.SelectExpressionFactory.Create(queryCompilationContext); var collectionSelectExpression = handlerContext.SelectExpression.Clone(queryCompilationContext.CreateUniqueTableAlias()); outerSelectExpression.AddTable(collectionSelectExpression); itemSelectExpression.Alias = queryCompilationContext.CreateUniqueTableAlias(); var joinExpression = outerSelectExpression.AddInnerJoin(itemSelectExpression); foreach (var property in entityType.FindPrimaryKey().Properties) { var itemProperty = itemSelectExpression.BindProperty( property, itemSelectExpression.ProjectStarTable.QuerySource); itemSelectExpression.AddToProjection(itemProperty); var collectionProperty = collectionSelectExpression.BindProperty( property, collectionSelectExpression.ProjectStarTable.QuerySource); collectionSelectExpression.AddToProjection(collectionProperty); var predicate = Expression.Equal( collectionProperty.LiftExpressionFromSubquery(collectionSelectExpression), itemProperty.LiftExpressionFromSubquery(itemSelectExpression)); joinExpression.Predicate = joinExpression.Predicate == null ? predicate : Expression.AndAlso( joinExpression.Predicate, predicate); } SetConditionAsProjection( handlerContext, new ExistsExpression(outerSelectExpression)); return(TransformClientExpression <bool>(handlerContext)); } } SetConditionAsProjection( handlerContext, new InExpression( item, handlerContext.SelectExpression.Clone(""))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient()); }
private static Expression HandleContains(HandlerContext handlerContext) { var filteringVisitor = handlerContext.CreateSqlTranslatingVisitor(bindParentQueries: true); var itemResultOperator = (ContainsResultOperator)handlerContext.ResultOperator; var item = filteringVisitor.Visit(itemResultOperator.Item); if (item != null) { var itemSelectExpression = item as SelectExpression; if (itemSelectExpression != null) { var entityType = handlerContext.Model.FindEntityType(handlerContext.QueryModel.MainFromClause.ItemType); if (entityType != null) { var outterSelectExpression = handlerContext.SelectExpressionFactory.Create(handlerContext.QueryModelVisitor.QueryCompilationContext); outterSelectExpression.SetProjectionExpression(Expression.Constant(1)); var collectionSelectExpression = handlerContext.SelectExpression.Clone(handlerContext.QueryModelVisitor.QueryCompilationContext.CreateUniqueTableAlias()); outterSelectExpression.AddTable(collectionSelectExpression); itemSelectExpression.Alias = handlerContext.QueryModelVisitor.QueryCompilationContext.CreateUniqueTableAlias(); var joinExpression = outterSelectExpression.AddInnerJoin(itemSelectExpression); foreach (var property in entityType.FindPrimaryKey().Properties) { itemSelectExpression.AddToProjection( new ColumnExpression( property.Name, property, itemSelectExpression.Tables.First())); collectionSelectExpression.AddToProjection( new ColumnExpression( property.Name, property, collectionSelectExpression.Tables.First())); var predicate = Expression.Equal( new ColumnExpression( property.Name, property, collectionSelectExpression), new ColumnExpression( property.Name, property, itemSelectExpression)); joinExpression.Predicate = joinExpression.Predicate == null ? predicate : Expression.AndAlso( joinExpression.Predicate, predicate); } SetProjectionConditionalExpression( handlerContext, Expression.Condition( new ExistsExpression(outterSelectExpression), Expression.Constant(true), Expression.Constant(false), typeof(bool))); return(TransformClientExpression <bool>(handlerContext)); } } SetProjectionConditionalExpression( handlerContext, Expression.Condition( new InExpression( new AliasExpression(item), handlerContext.SelectExpression.Clone("")), Expression.Constant(true), Expression.Constant(false), typeof(bool))); return(TransformClientExpression <bool>(handlerContext)); } return(handlerContext.EvalOnClient()); }