/// <summary>
 ///     Creates a new instance of a CrossJoinExpression.
 /// </summary>
 /// <param name="tableExpression"> The table expression. </param>
 public CrossJoinExpression([NotNull] TableExpressionBase tableExpression)
     : base(
         Check.NotNull(tableExpression, nameof(tableExpression)).QuerySource,
         tableExpression.Alias)
 {
     _tableExpression = tableExpression;
 }
 /// <summary>
 ///     Creates a new instance of LateralJoinExpression.
 /// </summary>
 /// <param name="tableExpression"> The target table expression. </param>
 public LateralJoinExpression([NotNull] TableExpressionBase tableExpression)
     : base(
         Check.NotNull(tableExpression, nameof(tableExpression)).QuerySource,
         tableExpression.Alias)
 {
     _tableExpression = tableExpression;
 }
Example #3
0
 /// <summary>
 ///     Specialized constructor for use only by derived class.
 /// </summary>
 /// <param name="tableExpression"> The target table expression. </param>
 protected JoinExpressionBase([NotNull] TableExpressionBase tableExpression)
     : base(
         Check.NotNull(tableExpression, nameof(tableExpression)).QuerySource,
         tableExpression.Alias)
 {
     _tableExpression = tableExpression;
 }
Example #4
0
 public ColumnExpression(
     [NotNull] string name,
     [NotNull] IProperty property,
     [NotNull] TableExpressionBase tableExpression)
     : this(name, Check.NotNull(property, nameof(property)).ClrType, tableExpression)
 {
     _property = property;
 }
Example #5
0
 /// <summary>
 ///     Creates a new instance of a ColumnReferenceExpression.
 /// </summary>
 /// <param name="aliasExpression"> The referenced AliasExpression. </param>
 /// <param name="tableExpression"> The target table expression. </param>
 public ColumnReferenceExpression(
     [NotNull] AliasExpression aliasExpression,
     [NotNull] TableExpressionBase tableExpression)
     : this(
         Check.NotNull(aliasExpression, nameof(aliasExpression)).Alias,
         aliasExpression,
         Check.NotNull(tableExpression, nameof(tableExpression)))
 {
 }
Example #6
0
 /// <summary>
 ///     Creates a new instance of a ColumnReferenceExpression.
 /// </summary>
 /// <param name="columnReferenceExpression"> The referenced ColumnReferenceExpression. </param>
 /// <param name="tableExpression"> The target table expression. </param>
 public ColumnReferenceExpression(
     [NotNull] ColumnReferenceExpression columnReferenceExpression,
     [NotNull] TableExpressionBase tableExpression)
     : this(
         Check.NotNull(columnReferenceExpression, nameof(columnReferenceExpression)).Name,
         columnReferenceExpression,
         Check.NotNull(tableExpression, nameof(tableExpression)))
 {
 }
Example #7
0
        // TODO: Make polymorphic

        /// <summary>
        ///     Updates the table expression of any column expressions in the target expression.
        /// </summary>
        /// <param name="expression"> The target expression. </param>
        /// <param name="tableExpression"> The new table expression. </param>
        /// <returns>
        ///     An updated expression.
        /// </returns>
        public virtual Expression UpdateColumnExpression(
            [NotNull] Expression expression,
            [NotNull] TableExpressionBase tableExpression)
        {
            Check.NotNull(expression, nameof(expression));
            Check.NotNull(tableExpression, nameof(tableExpression));

            var columnExpression = expression as ColumnExpression;

            if (columnExpression != null)
            {
                return(columnExpression.Property == null
                    ? new ColumnExpression(columnExpression.Name, columnExpression.Type, tableExpression)
                    : new ColumnExpression(columnExpression.Name, columnExpression.Property, tableExpression));
            }

            var aliasExpression = expression as AliasExpression;

            if (aliasExpression != null)
            {
                var selectExpression = aliasExpression.Expression as SelectExpression;
                if (selectExpression != null)
                {
                    return(new ColumnExpression(aliasExpression.Alias, selectExpression.Type, tableExpression));
                }

                return(new AliasExpression(
                           aliasExpression.Alias,
                           UpdateColumnExpression(aliasExpression.Expression, tableExpression))
                {
                    SourceMember = aliasExpression.SourceMember
                });
            }

            switch (expression.NodeType)
            {
            case ExpressionType.Coalesce:
            {
                var binaryExpression = (BinaryExpression)expression;
                var left             = UpdateColumnExpression(binaryExpression.Left, tableExpression);
                var right            = UpdateColumnExpression(binaryExpression.Right, tableExpression);
                return(binaryExpression.Update(left, binaryExpression.Conversion, right));
            }

            case ExpressionType.Conditional:
            {
                var conditionalExpression = (ConditionalExpression)expression;
                var test    = UpdateColumnExpression(conditionalExpression.Test, tableExpression);
                var ifTrue  = UpdateColumnExpression(conditionalExpression.IfTrue, tableExpression);
                var ifFalse = UpdateColumnExpression(conditionalExpression.IfFalse, tableExpression);
                return(conditionalExpression.Update(test, ifTrue, ifFalse));
            }
            }

            return(expression);
        }
Example #8
0
        /// <summary>
        ///     Adds a table to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The table expression. </param>
        /// <param name="createUniqueAlias"> true to create unique alias. </param>
        public virtual void AddTable([NotNull] TableExpressionBase tableExpression, bool createUniqueAlias = true)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));

            if (createUniqueAlias)
            {
                tableExpression.Alias = _queryCompilationContext.CreateUniqueTableAlias(tableExpression.Alias);
            }
            _tables.Add(tableExpression);
        }
Example #9
0
        /// <summary>
        ///     Adds a SQL LATERAL JOIN to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The target table expression. </param>
        /// <param name="projection"> A sequence of expressions that should be added to the projection. </param>
        public virtual void AddLateralJoin(
            [NotNull] TableExpressionBase tableExpression,
            [NotNull] IEnumerable <Expression> projection)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));
            Check.NotNull(projection, nameof(projection));

            _tables.Add(new LateralJoinExpression(tableExpression));
            _projection.AddRange(projection);
        }
Example #10
0
        public virtual void AddCrossJoin(
            [NotNull] TableExpressionBase tableExpression,
            [NotNull] IEnumerable <Expression> projection)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));
            Check.NotNull(projection, nameof(projection));

            tableExpression.Alias = CreateUniqueTableAlias(tableExpression.Alias);

            _tables.Add(new CrossJoinExpression(tableExpression));
            _projection.AddRange(projection);
        }
Example #11
0
        public ColumnExpression(
            [NotNull] string name,
            [NotNull] Type type,
            [NotNull] TableExpressionBase tableExpression)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(type, nameof(type));
            Check.NotNull(tableExpression, nameof(tableExpression));

            Name             = name;
            Type             = type;
            _tableExpression = tableExpression;
        }
        /// <summary>
        ///     Creates a new instance of a ColumnExpression.
        /// </summary>
        /// <param name="name"> The column name. </param>
        /// <param name="property"> The corresponding property. </param>
        /// <param name="tableExpression"> The target table expression. </param>
        public ColumnExpression(
            [NotNull] string name,
            [NotNull] IProperty property,
            [NotNull] TableExpressionBase tableExpression)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(property, nameof(property));
            Check.NotNull(tableExpression, nameof(tableExpression));

            Name             = name;
            _property        = property;
            _tableExpression = tableExpression;
        }
        /// <summary>
        ///     Creates a new instance of a ColumnExpression.
        /// </summary>
        /// <param name="name"> The column name. </param>
        /// <param name="type"> The column type. </param>
        /// <param name="tableExpression"> The target table expression. </param>
        public ColumnExpression(
            [NotNull] string name,
            [NotNull] Type type,
            [NotNull] TableExpressionBase tableExpression)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(type, nameof(type));
            Check.NotNull(tableExpression, nameof(tableExpression));

            Name = name;
            Type = type;
            _tableExpression = tableExpression;
        }
Example #14
0
        /// <summary>
        ///     Adds a SQL LEFT OUTER JOIN to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The target table expression. </param>
        /// <param name="projection"> A sequence of expressions that should be added to the projection. </param>
        public virtual JoinExpressionBase AddLeftOuterJoin(
            [NotNull] TableExpressionBase tableExpression,
            [NotNull] IEnumerable <Expression> projection)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));
            Check.NotNull(projection, nameof(projection));

            var outerJoinExpression = new LeftOuterJoinExpression(tableExpression);

            _tables.Add(outerJoinExpression);
            _projection.AddRange(projection);

            return(outerJoinExpression);
        }
Example #15
0
        public virtual JoinExpressionBase AddInnerJoin(
            [NotNull] TableExpressionBase tableExpression,
            [NotNull] IEnumerable <Expression> projection)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));
            Check.NotNull(projection, nameof(projection));

            tableExpression.Alias = CreateUniqueTableAlias(tableExpression.Alias);

            var innerJoinExpression = new InnerJoinExpression(tableExpression);

            _tables.Add(innerJoinExpression);
            _projection.AddRange(projection);

            return(innerJoinExpression);
        }
Example #16
0
        /// <summary>
        ///     Adds a column to the ORDER BY of this SelectExpression.
        /// </summary>
        /// <param name="column"> The column name. </param>
        /// <param name="property"> The corresponding EF property. </param>
        /// <param name="table"> The target table. </param>
        /// <param name="orderingDirection"> The ordering direction. </param>
        /// <returns>
        ///     An AliasExpression corresponding to the expression added to the ORDER BY.
        /// </returns>
        public virtual AliasExpression AddToOrderBy(
            [NotNull] string column,
            [NotNull] IProperty property,
            [NotNull] TableExpressionBase table,
            OrderingDirection orderingDirection)
        {
            Check.NotEmpty(column, nameof(column));
            Check.NotNull(property, nameof(property));
            Check.NotNull(table, nameof(table));

            var columnExpression = new ColumnExpression(column, property, table);
            var aliasExpression  = new AliasExpression(columnExpression);

            if (_orderBy.FindIndex(o => o.Expression.TryGetColumnExpression()?.Equals(columnExpression) ?? false) == -1)
            {
                _orderBy.Add(new Ordering(aliasExpression, orderingDirection));
            }

            return(aliasExpression);
        }
        /// <summary>
        ///     Adds a SQL INNER JOIN to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The target table expression. </param>
        /// <param name="projection"> A sequence of expressions that should be added to the projection. </param>
        /// <param name="innerPredicate">A predicate which should be appended to current predicate. </param>
        public virtual PredicateJoinExpressionBase AddInnerJoin(
            [NotNull] TableExpressionBase tableExpression,
            [NotNull] IEnumerable <Expression> projection,
            [CanBeNull] Expression innerPredicate)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));
            Check.NotNull(projection, nameof(projection));

            var innerJoinExpression = new InnerJoinExpression(tableExpression);

            _tables.Add(innerJoinExpression);
            _projection.AddRange(projection);

            if (innerPredicate != null)
            {
                Predicate = Predicate == null ? innerPredicate : AndAlso(Predicate, innerPredicate);
            }

            return(innerJoinExpression);
        }
        /// <summary>
        ///     Adds a SQL INNER JOIN to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The target table expression. </param>
        public virtual PredicateJoinExpressionBase AddInnerJoin([NotNull] TableExpressionBase tableExpression)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));

            return(AddInnerJoin(tableExpression, Enumerable.Empty <AliasExpression>(), innerPredicate: null));
        }
 public InnerJoinExpression([NotNull] TableExpressionBase tableExpression)
     : base(tableExpression)
 {
 }
Example #20
0
 public virtual void AddTable([NotNull] TableExpressionBase tableExpression)
 => _tables.Add(Check.NotNull(tableExpression, nameof(tableExpression)));
Example #21
0
 /// <summary>
 ///     Specialised constructor for use only by derived class.
 /// </summary>
 /// <param name="tableExpression"> The target table expression. </param>
 protected PredicateJoinExpressionBase([NotNull] TableExpressionBase tableExpression)
     : base(Check.NotNull(tableExpression, nameof(tableExpression)))
 {
 }
Example #22
0
        /// <summary>
        ///     Adds a SQL LEFT OUTER JOIN to this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The target table expression. </param>
        public virtual JoinExpressionBase AddLeftOuterJoin([NotNull] TableExpressionBase tableExpression)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));

            return(AddLeftOuterJoin(tableExpression, Enumerable.Empty <AliasExpression>()));
        }
Example #23
0
 public LeftOuterJoinExpression([NotNull] TableExpressionBase tableExpression)
     : base(Check.NotNull(tableExpression, nameof(tableExpression)))
 {
 }
Example #24
0
        /// <summary>
        ///     Removes a table from this SelectExpression.
        /// </summary>
        /// <param name="tableExpression"> The table expression. </param>
        public virtual void RemoveTable([NotNull] TableExpressionBase tableExpression)
        {
            Check.NotNull(tableExpression, nameof(tableExpression));

            _tables.Remove(tableExpression);
        }
Example #25
0
 private ColumnReferenceExpression(string name, Expression expression, TableExpressionBase tableExpression)
 {
     Name             = name;
     _expression      = expression;
     _tableExpression = tableExpression;
 }
Example #26
0
 /// <summary>
 ///     Creates a new instance of a CrossJoinExpression.
 /// </summary>
 /// <param name="tableExpression"> The table expression. </param>
 public CrossJoinExpression([NotNull] TableExpressionBase tableExpression)
     : base(Check.NotNull(tableExpression, nameof(tableExpression)))
 {
 }
        /// <summary>
        ///     Reduces the node and then calls the <see cref="ExpressionVisitor.Visit(Expression)" /> method passing the
        ///     reduced expression.
        ///     Throws an exception if the node isn't reducible.
        /// </summary>
        /// <param name="visitor"> An instance of <see cref="ExpressionVisitor" />. </param>
        /// <returns> The expression being visited, or an expression which should replace it in the tree. </returns>
        /// <remarks>
        ///     Override this method to provide logic to walk the node's children.
        ///     A typical implementation will call visitor.Visit on each of its
        ///     children, and if any of them change, should return a new copy of
        ///     itself with the modified children.
        /// </remarks>
        protected override Expression VisitChildren(ExpressionVisitor visitor)
        {
            _tableExpression = (TableExpressionBase)visitor.Visit(_tableExpression);

            return(this);
        }