protected override Expression VisitSubQuery(SubQueryExpression expression) { var parser = new SubQueryFilterParser(this, expression); var where = parser.BuildWhereFragment(); _holder.Register(where); return(null); }
private BinarySide analyze(Expression expression) { switch (expression) { case ConstantExpression c: return(new BinarySide(expression) { Constant = c }); case PartialEvaluationExceptionExpression p: { var inner = p.Exception; throw new BadLinqExpressionException($"Error in value expression inside of the query for '{p.EvaluatedExpression}'. See the inner exception:", inner); } case SubQueryExpression subQuery: { var parser = new SubQueryFilterParser(_parent, subQuery); return(new BinarySide(expression) { Comparable = parser.BuildCountComparisonStatement() }); } case QuerySourceReferenceExpression source: return(new BinarySide(expression) { Field = new SimpleDataField(source.Type) }); case BinaryExpression { NodeType: ExpressionType.Modulo } binary: return(new BinarySide(expression) { Comparable = new ModuloFragment(binary, _parent._statement.Fields) }); case BinaryExpression { NodeType: ExpressionType.NotEqual } ne: if (ne.Right is ConstantExpression v && v.Value == null) { var field = _parent._statement.Fields.FieldFor(ne.Left); return(new BinarySide(expression) { Comparable = new HasValueField(field) }); } throw new BadLinqExpressionException($"Invalid Linq Where() clause with expression: " + ne); case BinaryExpression binary: throw new BadLinqExpressionException($"Unsupported nested operator '{binary.NodeType}' as an operand in a binary expression"); case UnaryExpression u when u.NodeType == ExpressionType.Not: return(new BinarySide(expression) { Comparable = new NotField(_parent._statement.Fields.FieldFor(u.Operand)) }); default: return(new BinarySide(expression) { Field = _parent._statement.Fields.FieldFor(expression) }); } }