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));
        }
示例#4
0
        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);
        }