public static DbSelectExpression AddColumn(this DbSelectExpression select, DbColumnDeclaration column)
        {
            var columns = new List <DbColumnDeclaration>(select.Columns)
            {
                column
            };

            return(select.SetColumns(columns));
        }
        public static DbSelectExpression RemoveColumn(this DbSelectExpression select, DbColumnDeclaration column)
        {
            var columns = new List <DbColumnDeclaration>(select.Columns);

            if (columns != null)
            {
                columns.Remove(column);
            }

            return(select.SetColumns(columns));
        }
        protected override Expression VisitSelect(DbSelectExpression select)
        {
            select = base.VisitSelect(select) as DbSelectExpression;

            var cols       = select.Columns.OrderBy(c => c.Name).ToList();
            var removed    = new BitArray(select.Columns.Count);
            var anyRemoved = false;

            for (int i = 0, n = cols.Count; i < n - 1; i++)
            {
                var ci  = cols[i];
                var cix = ci.Expression as DbColumnExpression;
                var qt  = cix != null ? cix.QueryType : ci.QueryType;
                var cxi = new DbColumnExpression(ci.Expression.Type, qt, select.Alias, ci.Name);

                for (int j = i + 1; j < n; j++)
                {
                    if (!removed.Get(j))
                    {
                        var cj = cols[j];

                        if (SameExpression(ci.Expression, cj.Expression))
                        {
                            var cxj = new DbColumnExpression(cj.Expression.Type, qt, select.Alias, cj.Name);

                            this.map.Add(cxj, cxi);
                            removed.Set(j, true);
                            anyRemoved = true;
                        }
                    }
                }
            }

            if (anyRemoved)
            {
                var newDecls = new List <DbColumnDeclaration>();

                for (int i = 0, n = cols.Count; i < n; i++)
                {
                    if (!removed.Get(i))
                    {
                        newDecls.Add(cols[i]);
                    }
                }

                select = select.SetColumns(newDecls);
            }

            return(select);
        }