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; } })); }
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); })); }
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); }
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)); } }
public static IListQueryBuilder DefaultSort(this Csg.ListQuery.Sql.IListQueryBuilder builder, params string[] sortFields) { return(DefaultSort(builder, (IEnumerable <string>)sortFields)); }
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)); }