public static IQueryable <T> ProcessSearchSettings <T, S>(PagingInstruction pager, IQueryable <T> query)
        {
            if (pager == null)
            {
                return(query);
            }

            query = ProcessSearchSorting <T, S>(pager, query);
            query = ProcessSearchPaging <T>(pager, query);

            return(query);
        }
        private static IQueryable <T> ProcessSearchPaging <T>(PagingInstruction pager, IQueryable <T> query)
        {
            var skip = 0;
            var take = 0;

            pager.TotalRowCount = query.Count();

            if (pager.TotalRowCount == 0)
            {
                return(query);
            }

            if (pager.PageSize > 0)
            {
                if (pager.PageIndex > Math.Round(pager.TotalRowCount / (decimal)pager.PageSize, MidpointRounding.AwayFromZero))
                {
                    pager.PageIndex = Convert.ToInt32(Math.Round(pager.TotalRowCount / (decimal)pager.PageSize, MidpointRounding.AwayFromZero));
                }

                skip = pager.PageIndex * pager.PageSize;
                take = pager.PageSize;
            }

            if (pager.PageIndex < 0)
            {
                pager.PageIndex = 0;
            }

            if (pager.PageSize <= 0)
            {
                pager.PageSize = pager.TotalRowCount;
            }

            if (skip > 0)
            {
                query = query.Skip <T>(skip);
            }

            if (take > 0)
            {
                query = query.Take <T>(take);
            }

            return(query);
        }
示例#3
0
        public PaginationResult <TEntity> Paginate <TEntity, TSearch>(IQueryable <TEntity> query, TSearch searchObject, PagingInstruction pagingInstruction, Expression <Func <TEntity, bool> > predicate = null, string prefix = null)
        {
            var results    = PaginateInternal(query, searchObject, pagingInstruction, predicate, prefix);
            var totalCount = pagingInstruction.TotalRowCount;
            var data       = results.Item2.ToList();

            return(new PaginationResult <TEntity>
                   (
                       data,
                       pagingInstruction.PageIndex,
                       pagingInstruction.PageSize,
                       totalCount
                   ));
        }
示例#4
0
        private Tuple <IQueryable <TEntity>, IQueryable <TEntity> > PaginateInternal <TEntity, TSearch>(IQueryable <TEntity> query, TSearch searchObject, PagingInstruction pagingInstruction, Expression <Func <TEntity, bool> > predicate = null, string prefix = null)
        {
            var queryString = string.Empty;
            var parameters  = new object[] { };

            if (DynamicQueryableHelper.ParseSearchVars(searchObject, ref queryString, ref parameters))
            {
                query = query.Where(queryString, parameters);
            }

            if (predicate != null)
            {
                query = query.Where(predicate);
            }

            var collection = DynamicQueryableHelper.ProcessSearchSettings <TEntity, TSearch>(pagingInstruction, query);

            return(new Tuple <IQueryable <TEntity>, IQueryable <TEntity> >(query, collection));
        }
示例#5
0
 public IQueryable <TDatasource> ValidatePaging <TDatasource>(PagingInstruction pager, IQueryable <TDatasource> queryable) where TDatasource : class
 {
     return(DynamicQueryableHelper.ValidatePaging(pager, queryable));
 }
示例#6
0
 public IQueryable <T> ProcessSearchSettings <T, S>(PagingInstruction pager, IQueryable <T> query)
 {
     return(DynamicQueryableHelper.ProcessSearchSettings <T, S>(pager, query));
 }
示例#7
0
        public async Task <PaginationResult <TContract> > PaginateAsync <TEntity, TContract, TSearch>(IQueryable <TEntity> query, TSearch searchObject, PagingInstruction pagingInstruction, Expression <Func <TEntity, bool> > predicate = null, string prefix = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            var results    = PaginateInternal(query, searchObject, pagingInstruction, predicate, prefix);
            var totalCount = pagingInstruction.TotalRowCount;
            var data       = await ToListAsync(MapperExtension.ProjectTo <TEntity, TContract>(results.Item2), cancellationToken);

            return(new PaginationResult <TContract>
                   (
                       data,
                       pagingInstruction.PageIndex,
                       pagingInstruction.PageSize,
                       totalCount
                   ));
        }
示例#8
0
 public static Task <PaginationResult <TEntity> > PaginateAsync <TEntity, TSearch>(this IQueryable <TEntity> query, TSearch searchObject, PagingInstruction pagingInstruction, Expression <Func <TEntity, bool> > predicate = null, string prefix = null, CancellationToken cancellationToken = default(CancellationToken))
 {
     return(OrmHelper.PaginateAsync(query, searchObject, pagingInstruction, predicate, prefix, cancellationToken));
 }
示例#9
0
 public static PaginationResult <TEntity> Paginate <TEntity, TSearch>(this IQueryable <TEntity> query, TSearch searchObject, PagingInstruction pagingInstruction, Expression <Func <TEntity, bool> > predicate = null, string prefix = null)
 {
     return(OrmHelper.Paginate(query, searchObject, pagingInstruction, predicate, prefix));
 }
示例#10
0
 public static IQueryable <TDatasource> ValidatePaging <TDatasource>(this IQueryable <TDatasource> queryable, PagingInstruction pager) where TDatasource : class
 {
     return(OrmHelper.ValidatePaging(pager, queryable));
 }
示例#11
0
 public static IQueryable <T> ProcessSearchSettings <T, S>(this IQueryable <T> query, PagingInstruction pager)
 {
     return(OrmHelper.ProcessSearchSettings <T, S>(pager, query));
 }
        private static IQueryable <T> ProcessSearchSorting <T, S>(PagingInstruction pager, IQueryable <T> query)
        {
            var type = typeof(T);

            if (pager.SortOptions == null || pager.SortOptions.Count == 0)
            {
                pager.SortOptions = new List <SortingInstruction>();
                var columnName = default(string);

                if (type.GetProperties().Where(pname => DefaultSortFields.Contains(pname.Name)).Select(x => x.Name).Count() > 0)
                {
                    columnName = type.GetProperties().Where(pname => DefaultSortFields.Contains(pname.Name)).Select(x => x.Name).First();
                }

                if (string.IsNullOrWhiteSpace(columnName))
                {
                    throw new Exception("The Object does not seem to have any fields to use for sorting. This is required in order to handle paging correctly.");
                }

                pager.SortOptions.Add(new SortingInstruction()
                {
                    Column = columnName, Direction = SortOrder.Ascending
                });
            }

            var sortString = new StringBuilder();

            foreach (var sortBy in pager.SortOptions)
            {
                if (sortString.Length > 0)
                {
                    sortString.Append(",");
                }

                type = typeof(S);

                var columnName = sortBy.Column;
                var property   = type.GetProperty(columnName);

                if (property == null)
                {
                    property = type.GetProperty(columnName.ToUpperFirstLetter());
                }

                if (property == null)
                {
                    type     = typeof(T);
                    property = type.GetProperty(columnName);
                }

                if (property == null)
                {
                    property = type.GetProperty(columnName.ToUpperFirstLetter());
                }

                if (property == null)
                {
                    continue;
                }

                var attribute = property.GetCustomAttribute <MapAttribute>(true);

                if (attribute != null)
                {
                    columnName = attribute.Name;
                }

                sortString.AppendFormat("{0} {1}", columnName, sortBy.Direction);
            }

            return(query.OrderBy(sortString.ToString()));
        }
        public static IQueryable <TDatasource> ValidatePaging <TDatasource>(PagingInstruction pager, IQueryable <TDatasource> queryable) where TDatasource : class
        {
            var skip = 0;
            var take = 0;

            if (pager == null)
            {
                return(queryable);
            }

            pager.TotalRowCount = queryable.Count();

            if (pager.TotalRowCount == 0)
            {
                return(queryable);
            }

            if (pager.PageSize > 0)
            {
                if (pager.PageIndex > Math.Round(pager.TotalRowCount / (decimal)pager.PageSize, MidpointRounding.AwayFromZero))
                {
                    pager.PageIndex = Convert.ToInt32(Math.Round(pager.TotalRowCount / (decimal)pager.PageSize, MidpointRounding.AwayFromZero));
                }

                skip = pager.PageIndex * pager.PageSize;
                take = pager.PageSize;
            }

            var t = typeof(TDatasource);

            if (pager.SortOptions == null || pager.SortOptions.Count == 0)
            {
                pager.SortOptions = new List <SortingInstruction>();
                var columnName = default(string);

                // Attempt to assign a default sort because the client doesn't seem to care.
                if (t.GetProperties().Where(pname => DefaultSortFields.Contains(pname.Name)).Select(x => x.Name).Count() > 0)
                {
                    columnName = t.GetProperties().Where(pname => DefaultSortFields.Contains(pname.Name)).Select(x => x.Name).First();
                }
                else
                {
                    var destElement = Activator.CreateInstance <TDatasource>();
                    var list        = t.GetProperties(BindingFlags.Public | BindingFlags.Instance).AsQueryable();

                    if (list.Count() > 0)
                    {
                        columnName = list.First().Name;
                    }
                }

                if (string.IsNullOrWhiteSpace(columnName))
                {
                    throw new Exception("The Object does not seem to have any sort fields. This is required in order to handle paging correctly.");
                }

                pager.SortOptions.Add(new SortingInstruction()
                {
                    Column = columnName
                });
            }

            var sortByString = new StringBuilder();

            foreach (var sortby in pager.SortOptions)
            {
                if (sortByString.Length > 0)
                {
                    sortByString.Append(",");
                }

                var columnName = sortby.Column;
                sortByString.AppendFormat("{0} {1}", columnName, sortby.Direction);
            }

            queryable = queryable.OrderBy(sortByString.ToString());

            if (pager.PageIndex < 0)
            {
                pager.PageIndex = 0;
            }

            if (pager.PageSize <= 0)
            {
                pager.PageSize = pager.TotalRowCount;
            }

            if (skip > 0)
            {
                queryable = queryable.Skip(skip);
            }

            if (take > 0)
            {
                queryable = queryable.Take(take);
            }

            return(queryable);
        }