예제 #1
0
 public static IListQueryBuilder DefaultLimit(this Csg.ListQuery.Sql.IListQueryBuilder builder, int limit)
 {
     return(builder.BeforeApply((config) =>
     {
         if (config.QueryDefinition.Limit <= 0)
         {
             config.QueryDefinition.Limit = limit;
         }
     }));
 }
예제 #2
0
        public static IListQueryBuilder MaxLimit(this Csg.ListQuery.Sql.IListQueryBuilder builder, int maxLimit, bool silent = true)
        {
            return(builder.BeforeApply((config) =>
            {
                if (config.QueryDefinition.Limit > maxLimit && !silent)
                {
                    throw new InvalidOperationException($"The value specified for limit {config.QueryDefinition.Limit} is greater than the maximum allowed value of {maxLimit}.");
                }

                config.QueryDefinition.Limit = Math.Min(maxLimit, config.QueryDefinition.Limit);
            }));
        }
예제 #3
0
 public static IListQueryBuilder DefaultSort(this Csg.ListQuery.Sql.IListQueryBuilder builder, IEnumerable <string> sortFields)
 {
     builder.AfterApply((config, query) =>
     {
         if (query.OrderBy.Count == 0)
         {
             foreach (var sortField in sortFields)
             {
                 query.OrderBy.Add(sortField);
             }
         }
     });
     return(builder);
 }
예제 #4
0
        public static SqlStatementBatch Render(this Csg.ListQuery.Sql.IListQueryBuilder builder, bool getTotalWhenLimiting = true)
        {
            var appiedQuery = builder.Apply();

            if (getTotalWhenLimiting && appiedQuery.PagingOptions?.Limit > 0 && appiedQuery.PagingOptions?.Offset == 0)
            {
                var countQuery = GetCountQuery(builder);
                return(new DbQueryBuilder[] { (DbQueryBuilder)countQuery, (DbQueryBuilder)appiedQuery }
                       .RenderBatch());
            }
            else
            {
                var stmt = appiedQuery.Render();
                return(new SqlStatementBatch(1, stmt.CommandText, stmt.Parameters));
            }
        }
예제 #5
0
 public static IListQueryBuilder DefaultSort(this Csg.ListQuery.Sql.IListQueryBuilder builder, params string[] sortFields)
 {
     return(DefaultSort(builder, (IEnumerable <string>)sortFields));
 }
예제 #6
0
        public async static System.Threading.Tasks.Task <ListQueryResult <T> > GetResultAsync <T>(this Csg.ListQuery.Sql.IListQueryBuilder builder, bool getTotalWhenLimiting = true)
        {
            var             stmt        = builder.Render(getTotalWhenLimiting);
            int?            totalCount  = null;
            IEnumerable <T> data        = null;
            bool            isBuffered  = !builder.Configuration.UseStreamingResult;
            bool            limitOracle = builder.Configuration.QueryDefinition.Limit > 0 && builder.Configuration.UseLimitOracle && !builder.Configuration.UseStreamingResult;
            int?            dataCount   = null;
            int?            nextOffset  = null;
            int?            prevOffset  = null;

            if (stmt.Count == 1)
            {
                data = await builder.Configuration.DataAdapter.GetResultsAsync <T>(stmt, builder.Configuration.UseStreamingResult, builder.Configuration.QueryBuilder.CommandTimeout);
            }
            else if (stmt.Count == 2)
            {
                var batchResult = await builder.Configuration.DataAdapter.GetTotalCountAndResultsAsync <T>(stmt, builder.Configuration.UseStreamingResult, builder.Configuration.QueryBuilder.CommandTimeout);
            }
            else
            {
                throw new NotSupportedException("A statement with more than 2 queries is not supported.");
            }

            //TODO: Can we still use .Take() here with a limit oracle when streaming?
            // if the data is streamed, we can't provide a total count, and we can't use the next page oracle
            if (limitOracle)
            {
                // if we used a limit oracle, then strip the last row off
                int actualCount = data.Count();
                data      = data.Take(builder.Configuration.QueryDefinition.Limit);
                dataCount = data.Count();

                // if more records were fetched than limit, then there is at least one more page of data to fetch.
                if (actualCount > dataCount)
                {
                    nextOffset = builder.Configuration.QueryDefinition.Offset + builder.Configuration.QueryDefinition.Limit;
                }
            }
            else if (builder.Configuration.QueryDefinition.Limit > 0)
            {
                nextOffset = builder.Configuration.QueryDefinition.Offset + builder.Configuration.QueryDefinition.Limit;
            }

            if (builder.Configuration.QueryDefinition.Offset > 0)
            {
                prevOffset = Math.Max(builder.Configuration.QueryDefinition.Offset - builder.Configuration.QueryDefinition.Limit, 0);
            }

            return(new ListQueryResult <T>(data, dataCount, totalCount, isBuffered, builder.Configuration.QueryDefinition.Limit, nextOffset, prevOffset));
        }