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