コード例 #1
0
        public TableSelectExpression Prepare(IExpressionPreparer preparer)
        {
            var selectExp = new TableSelectExpression {
                GroupMax          = GroupMax,
                Distinct          = Distinct,
                CompositeFunction = CompositeFunction,
                IsCompositeAll    = IsCompositeAll
            };

            foreach (var column in Columns)
            {
                selectExp.Columns.Add(column.Prepare(preparer));
            }

            if (From != null)
            {
                selectExp.From = From.Prepare(preparer);
            }

            if (Into != null)
            {
                selectExp.Into = Into.Prepare(preparer);
            }

            if (whereClause != null)
            {
                selectExp.Where = whereClause.Prepare(preparer);
            }

            foreach (var column in GroupBy)
            {
                selectExp.GroupBy.Add(column.Prepare(preparer));
            }

            if (Having != null)
            {
                selectExp.Having = Having.Prepare(preparer);
            }

            if (NextComposite != null)
            {
                selectExp.NextComposite = NextComposite.Prepare(preparer);
            }

            return(selectExp);
        }
コード例 #2
0
        private void PrepareInner()
        {
            List <ColumnClause> ColumnsLocal = GetAllColumns();
            HashSet <string>    uniqCols     = new HashSet <string>();
            int i2 = 0;

            foreach (var cs in ColumnsLocal)
            {
                string s = cs.ExtractAlias();
                if (!string.IsNullOrEmpty(s) && !uniqCols.Contains(s))
                {
                    cs.InternalDbAlias = s;
                }
                if (string.IsNullOrEmpty(cs.InternalDbAlias))
                {
                    while (true)
                    {
                        string nm = "col" + i2.ToString();
                        if (uniqCols.Contains(nm))
                        {
                            i2++;
                            continue;
                        }
                        cs.InternalDbAlias = nm;
                        uniqCols.Add(cs.InternalDbAlias);
                        break;
                    }
                }
            }


            if (GroupBys != null && GroupBys.Count > 0)
            {
                //подготовка group by. В колонках пока не поддерживаются агрегатные функции
                for (int i = 0; i < GroupBys.Count; i++)
                {
                    GroupByClause gb = GroupBys[i];
                    if (gb.Expression != null)
                    {
                        gb.Expression.Prepare();
                    }
                }
                //сверяем выражения в groupby и колонках. Всё что в колонках должно быть groupby

                /*
                 * for (int i = 0; i < Columns.Length; i++)
                 * {
                 *  ColumnSelect cs = Columns[i];
                 *  string s1 = cs.ColumnExpressionStr.ToLower().Trim();
                 *  var arr = GroupBys.Where(a => a.ExpressionStr.ToLower().Trim() == s1).ToArray();
                 *  if (arr.Length == 0) throw new Exception(string.Format("Column {0} not found in groupby expression"));
                 * }*/
            }

            if (WhereExpr != null)
            {
                WhereExpr.Prepare();
                ExpUtils.CheckWhere(WhereExpr);
            }
            if (Having != null)
            {
                Having.Prepare();
            }
            if (OrderBys != null && OrderBys.Count > 0)
            {
                //подготовка group by. В колонках пока не поддерживаются агрегатные функции
                for (int i = 0; i < OrderBys.Count; i++)
                {
                    OrderByClause gb = OrderBys[i];
                    if (gb.Expression != null)
                    {
                        gb.Expression.Prepare();
                    }
                }
            }
        }