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); }
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(); } } } }