public static SelectExpression RemoveColumn(this SelectExpression select, ColumnDeclaration column) { List <ColumnDeclaration> columns = new List <ColumnDeclaration>(select.Columns); columns.Remove(column); return(select.SetColumns(columns)); }
protected override Expression VisitJoin(JoinExpression join) { join = (JoinExpression)base.VisitJoin(join); if ((join.Join == JoinType.CrossApply) || (join.Join == JoinType.OuterApply)) { if (join.Right is TableExpression) { return(new JoinExpression(JoinType.CrossJoin, join.Left, join.Right, null)); } SelectExpression right = join.Right as SelectExpression; if ((((right != null) && (right.Take == null)) && ((right.Skip == null) && !AggregateChecker.HasAggregates(right))) && ((right.GroupBy == null) || (right.GroupBy.Count == 0))) { SelectExpression source = right.SetWhere(null); HashSet <TableAlias> set = ReferencedAliasGatherer.Gather(source); HashSet <TableAlias> other = DeclaredAliasGatherer.Gather(join.Left); set.IntersectWith(other); if (set.Count == 0) { Expression where = right.Where; right = source; ProjectedColumns columns = ColumnProjector.ProjectColumns(this.language, where, right.Columns, right.Alias, DeclaredAliasGatherer.Gather(right.From)); right = right.SetColumns(columns.Columns); where = columns.Projector; return(new JoinExpression((where == null) ? JoinType.CrossJoin : ((join.Join == JoinType.CrossApply) ? JoinType.InnerJoin : JoinType.LeftOuter), join.Left, right, where)); } } } return(join); }
public static SelectExpression AddColumn(this SelectExpression select, ColumnDeclaration column) { List <ColumnDeclaration> columns = new List <ColumnDeclaration>(select.Columns) { column }; return(select.SetColumns(columns)); }
protected override Expression VisitSelect(SelectExpression selectExpression) { selectExpression = (SelectExpression)base.VisitSelect(selectExpression); List <ColumnDeclaration> list = (from c in selectExpression.Columns orderby c.Name select c).ToList <ColumnDeclaration>(); BitArray array = new BitArray(selectExpression.Columns.Count); bool flag = false; int index = 0; int count = list.Count; while (index < (count - 1)) { ColumnDeclaration declaration = list[index]; ColumnExpression expression = declaration.Expression as ColumnExpression; QueryType queryType = (expression != null) ? expression.QueryType : declaration.QueryType; ColumnExpression expression2 = new ColumnExpression(declaration.Expression.Type, queryType, selectExpression.Alias, declaration.Name); for (int i = index + 1; i < count; i++) { if (!array.Get(i)) { ColumnDeclaration declaration2 = list[i]; if (this.SameExpression(declaration.Expression, declaration2.Expression)) { ColumnExpression key = new ColumnExpression(declaration2.Expression.Type, queryType, selectExpression.Alias, declaration2.Name); this.map.Add(key, expression2); array.Set(i, true); flag = true; } } } index++; } if (flag) { List <ColumnDeclaration> columns = new List <ColumnDeclaration>(); index = 0; count = list.Count; while (index < count) { if (!array.Get(index)) { columns.Add(list[index]); } index++; } selectExpression = selectExpression.SetColumns(columns); } return(selectExpression); }