private string ToSql(ISqlFormatter sql, IList <IColumn> select, IFilterParameters filterParams, IEnumerable <Filter> outerFilters, long skip, int take) { if (Aggregations.Count == 1) { return(Aggregations[0].ToSql(sql, select, outerFilters.Concat(Filters), filterParams, OrderBy, skip, take)); } var ordering = "a0.Value0 desc"; if (select != null && OrderBy.Count != 0) { ordering = string.Join(", ", OrderBy.Select(FindOrderingColumn)); } return(_aggregatedTemplate(new { skipAndTake = sql.SkipAndTake(skip, take), Aggregations = Aggregations.Select(x => x.ToSql(sql, select, outerFilters.Concat(Filters), filterParams)), Select = select, ordering })); }
public string ToSql( ISqlFormatter sql, IEnumerable <IColumn> selectColumns, IEnumerable <Filter> outerFilters, IFilterParameters filterParams, IEnumerable <Ordering> orderings = null, long?skip = null, int?take = null) { var joins = new Joins(); var selects = selectColumns?.Select((c, i) => $"{sql.IdentifierPair(joins[c.Table], c.DbName)} Select{i}").ToList() ?? new List <string>(); var aggColumn = Column != null ? $"{Function}({joins.Aliased(Column, sql)})" : null; if (aggColumn != null) { selects.Add($"{aggColumn} Value0"); } if (selects.Count == 0) { throw new InvalidOperationException("Must select something"); } var filters = outerFilters.Concat(Filters).Select(f => new { Column = joins.Aliased(f.Column, sql), f.Operator, Param = filterParams[f] }) .ToList(); var groupBy = selectColumns?.Select(x => new { Part = joins.Aliased(x, sql) }) .ToList(); var skipAndTake = skip != null && take != null ? sql.SkipAndTake(skip.Value, take.Value) : null; var orderBy = skipAndTake == null ? null : orderings.Any() ? string.Join(", ", orderings.Select(x => $"{joins.Aliased(x.Column, sql)} {x.Direction}")) : aggColumn != null ? $"{aggColumn} desc" : null; return(_template(new { selects, filters, joins = joins.ToSql(sql), groupBy, orderBy, skipAndTake })); }