private SqlSelectStatement VisitFilterExpression(PredicateBinding input, Predicate predicate, bool negatePredicate) { Symbol fromSymbol; var result = VisitInputExpression(input.Predicate, input.VariableName, input.VariableType, out fromSymbol); if (!IsCompatible(result, PredicateType.Filter)) { result = CreateNewSelectStatement(result, input.VariableName, input.VariableType, out fromSymbol); } selectStatementStack.Push(result); symbolTable.EnterScope(); AddFromSymbol(result, input.VariableName, fromSymbol); if (negatePredicate) { result.Where.Append("NOT ("); } result.Where.Append(predicate.Accept(this)); if (negatePredicate) { result.Where.Append(")"); } symbolTable.ExitScope(); selectStatementStack.Pop(); return(result); }
internal Predicate Filter(PredicateBinding input, Predicate predicate) { return(input.Filter(predicate)); }
internal Predicate Project(PredicateBinding input, Predicate projection) { return(input.Project(projection)); }
internal Predicate TranslateLambda(LambdaExpression lambda, Predicate input, out PredicateBinding binding) { input = NormalizeSetSource(input); binding = input.BindAs(_aliasGenerator.Next()); return(TranslateLambda(lambda, binding.Variable)); }
protected override Predicate TranslateOneLambda(PredicateConverter parent, PredicateBinding sourceBinding, Predicate lambda) { return(parent.Project(sourceBinding, lambda)); }
protected abstract Predicate TranslateOneLambda(PredicateConverter parent, PredicateBinding sourceBinding, Predicate lambda);
protected Predicate Translate(PredicateConverter parent, MethodCallExpression call, out Predicate source, out PredicateBinding sourceBinding, out Predicate lambda) { source = parent.TranslateExpression(call.Arguments[0]); var lambdaExpression = parent.GetLambdaExpression(call, 1); lambda = parent.TranslateLambda(lambdaExpression, source, out sourceBinding); return(TranslateOneLambda(parent, sourceBinding, lambda)); }