/// <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; }
/// <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; }
public ColumnExpression( [NotNull] string name, [NotNull] IProperty property, [NotNull] TableExpressionBase tableExpression) : this(name, Check.NotNull(property, nameof(property)).ClrType, tableExpression) { _property = property; }
/// <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))) { }
/// <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))) { }
// 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); }
/// <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); }
/// <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); }
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); }
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; }
/// <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); }
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); }
/// <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) { }
public virtual void AddTable([NotNull] TableExpressionBase tableExpression) => _tables.Add(Check.NotNull(tableExpression, nameof(tableExpression)));
/// <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))) { }
/// <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>())); }
public LeftOuterJoinExpression([NotNull] TableExpressionBase tableExpression) : base(Check.NotNull(tableExpression, nameof(tableExpression))) { }
/// <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); }
private ColumnReferenceExpression(string name, Expression expression, TableExpressionBase tableExpression) { Name = name; _expression = expression; _tableExpression = tableExpression; }
/// <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); }