public async Task <PagedCollection <T> > QueryPagedAsync <T>(string sql, IPagedFilter filter, CancellationToken cancellationToken = default) where T : class
        {
            var orderByIndex = sql.LastIndexOf("ORDER BY", StringComparison.CurrentCultureIgnoreCase);

            if (orderByIndex <= 0)
            {
                throw new SqlSyntaxException("ORDER BY Clause not found. To filter as pagged you need to provide an ORDER BY Clause.");
            }

            var newSql = sql.Substring(0, orderByIndex);

            var query = $"SELECT COUNT(1) FROM ({newSql}) C;" + sql.AddPagination(filter, dataSource);

            using var con = GetConnection();
            var qResult = await con.QueryMultipleAsync(new CommandDefinition(query, filter, cancellationToken : cancellationToken));

            int totalRecords = qResult.ReadFirst <int>();

            var result = new PagedCollection <T>(qResult.Read <T>(), filter.Page, filter.PageSize)
            {
                TotalRecords = totalRecords
            };

            return(result);
        }
示例#2
0
        internal static string AddPagination(this string rawSql, IPagedFilter pagedFilter, IDataSource dataSource)
        {
            if (pagedFilter.IsNull())
            {
                return(rawSql);
            }

            var recordStart = pagedFilter.Page * pagedFilter.PageSize;

            if (recordStart < 0)
            {
                recordStart = 0;
            }

            switch (dataSource.Provider)
            {
            case Provider.PostgreSqL:
                return($"{rawSql} OFFSET ({recordStart}) LIMIT @PageSize ");

            case Provider.Oracle:
                pagedFilter.Page = pagedFilter.Page <= 0 ? 1 : pagedFilter.Page;
                return
                    ($" SELECT * FROM (SELECT a.*, rownum r_  FROM ({rawSql}) a WHERE rownum < (({pagedFilter.Page} * {pagedFilter.PageSize}) + 1) ) WHERE r_ >=  ((({pagedFilter.Page} - 1) * {pagedFilter.PageSize}) + 1)");

            case Provider.MsSql:
                return($"{rawSql} OFFSET {recordStart} ROWS FETCH NEXT @PageSize ROWS ONLY");

            default:
                return($"{rawSql} OFFSET {recordStart} ROWS FETCH NEXT @PageSize ROWS ONLY");
            }
        }
示例#3
0
 public RemarkStorage(IStorageClient storageClient,
                      IPagedFilter <Remark, BrowseRemarks> browseRemarksFilter,
                      IPagedFilter <Remark, BrowseSimilarRemarks> browseSimilarRemarksFilter,
                      ICache cache,
                      RedisSettings redisSettings)
 {
     _storageClient              = storageClient;
     _cache                      = cache;
     _browseRemarksFilter        = browseRemarksFilter;
     _browseSimilarRemarksFilter = browseSimilarRemarksFilter;
     _useCache                   = redisSettings.Enabled;
 }
        public Task <IEnumerable <T> > QueryListPagedAsync <T>(string sql, IPagedFilter filter, CancellationToken cancellationToken = default)
        {
            if (sql == null)
            {
                throw new ArgumentNullException(nameof(sql));
            }
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            return(QueryListPagedInternalAsync <T>(sql, filter, cancellationToken));
        }
        internal static string AddPagination(this string rawSql, IPagedFilter pagedFilter, IDataSource dataSource)
        {
            if (pagedFilter.IsNull())
            {
                return(rawSql);
            }

            var recordStart = (pagedFilter.Page) * pagedFilter.PageSize;

            if (recordStart < 0)
            {
                recordStart = 0;
            }

            return(dataSource.Provider switch
            {
                Provider.PostgreSqL => $"{rawSql} OFFSET ({recordStart}) LIMIT @PageSize ",
                _ => $"{rawSql} OFFSET {recordStart} ROWS FETCH NEXT @PageSize ROWS ONLY"
            });
        private async Task <IEnumerable <T> > QueryListPagedInternalAsync <T>(string sql, IPagedFilter filter, CancellationToken cancellationToken = default)
        {
            var query = sql.AddPagination(filter, dataSource);

            using var con = GetConnection();

            return(await con.QueryAsync <T>(new CommandDefinition(query, filter, cancellationToken : cancellationToken)).ConfigureAwait(false));
        }
        public static async Task <IPagedList <TResult> > ToPagedListAsync <TSource, TResult>(this IQueryable <TSource> source, IPagedFilter filter, Expression <Func <TSource, TResult> > map)
        {
            filter = filter ?? new PagedFilter();
            var count = await source.LongCountAsync();

            if (count == 0 || filter.Take == 0)
            {
                return(new PagedList <TResult>
                {
                    Take = filter.Take,
                    Skip = filter.Skip,
                    Total = count,
                    Results = new List <TResult>()
                });
            }

            var results = await source
                          .Skip(filter.Skip)
                          .Take(filter.Take)
                          .ToListAsync();

            var func = map.Compile();

            return(new PagedList <TResult>
            {
                Take = filter.Take,
                Skip = filter.Skip,
                Total = count,
                Results = results.Select(func).ToList()
            });
        }
 public static Task <IPagedList <TSource> > ToPagedListAsync <TSource>(this IQueryable <TSource> source, IPagedFilter filter)
 {
     return(source.ToPagedListAsync(filter, x => x));
 }
示例#9
0
        public async Task <PagedCollection <T> > QueryPagedAsync <T>(string sql, IPagedFilter filter, bool useCount = true,
                                                                     CancellationToken cancellationToken            = default) where T : class
        {
            if (sql == null)
            {
                throw new ArgumentNullException(nameof(sql));
            }

            var orderByIndex = sql.LastIndexOf("ORDER BY", StringComparison.CurrentCultureIgnoreCase);

            if (orderByIndex <= 0)
            {
                throw new SqlSyntaxException(
                          "ORDER BY Clause not found. To filter as paged you need to provide an ORDER BY Clause.");
            }

            var newSql = sql.Substring(0, orderByIndex);

            var queryPaged = sql.AddPagination(filter, dataSource);

            using var con = GetConnection();

            if (!useCount)
            {
                var pagedResult =
                    await con.QueryAsync <T>(new CommandDefinition(queryPaged, filter,
                                                                   cancellationToken : cancellationToken)).ConfigureAwait(false);

                return(new PagedCollection <T>(pagedResult, filter.Page, filter.PageSize));
            }

            var queryCount = $"SELECT COUNT(1) FROM ({newSql}) C WITH(NOLOCK)";

            var             totalRecords = 0;
            IEnumerable <T> queryResult  = null;

            if (dataSource.Provider == Provider.Oracle)
            {
                totalRecords = await con
                               .QuerySingleAsync <int>(new CommandDefinition(queryCount, filter,
                                                                             cancellationToken : cancellationToken))
                               .ConfigureAwait(false);

                queryResult = await con
                              .QueryAsync <T>(new CommandDefinition(queryPaged, filter, cancellationToken : cancellationToken))
                              .ConfigureAwait(false);
            }
            else
            {
                var query   = $"{queryCount}; {queryPaged}";
                var qResult = await con.QueryMultipleAsync(new CommandDefinition(query, filter,
                                                                                 cancellationToken : cancellationToken)).ConfigureAwait(false);

                totalRecords = qResult.ReadFirst <int>();
                queryResult  = await qResult.ReadAsync <T>().ConfigureAwait(false);
            }

            return(new PagedCollection <T>(queryResult, filter.Page, filter.PageSize)
            {
                TotalRecords = totalRecords
            });
        }
示例#10
0
        protected async Task <IPagedList <TResult> > ApplyFilterAsync <TResult>(IQueryable <TResult> query, IPagedFilter filter)
        {
            var pagedList = new PagedList <TResult>(query, filter.Page, filter.PageSize, filter.PageIndexFrom);

            return(await Task.FromResult(pagedList));
        }
示例#11
0
 public static IPagedQueryResult <IEnumerable <TAny> > ToPagedQueryResult <TAny>(this IEnumerable <TAny> obj, IPagedFilter filter, int rowCount)
 {
     return(obj.ToPagedQueryResult(filter.PageIndex, filter.PageSize, rowCount));
 }
示例#12
0
 public static IQueryable <TAny> GetPaged <TAny>(this IQueryable <TAny> query, IPagedFilter paged)
     where TAny : class => GetPaged(query, paged.PageIndex, paged.PageSize);