internal static IQueryable <TEntity> Paged <TEntity>(this IQueryable <TEntity> source, int itemId, bool isPrev, int count = 0) where TEntity : class, IListItemEntity, new() { Check.NotNull(source, nameof(source)); if (source is SpEntityQueryable <TEntity, ISpEntryDataContext> ) { var executor = (source as SpEntityQueryable <TEntity, ISpEntryDataContext>).GetExecutor(); if (executor != null) { var args = (SpQueryArgs <ISpEntryDataContext>)executor.SpQueryArgs.Clone(); var lastItem = itemId > 0 ? source.Where(item => item.Id == itemId).FirstListItem() : null; if (lastItem != null) { args.IsPaged = true; args.IsPagedPrev = isPrev; var expression = new PagedExpression <ISpEntryDataContext>(source.Expression, args, lastItem, false); var provider = new SpEntityQueryable <TEntity>(args).Provider; source = new SpEntityQueryable <TEntity>(provider, source.Expression).Concat(new SpEntityQueryable <TEntity>(provider, expression)); if (count > 0) { source = source.Take(count); } } else { source = Enumerable.Empty <TEntity>().AsQueryable(); } } } return(source); }
public static IQueryable <TEntity> Paged <TEntity>(this IQueryable <TEntity> source, string pagingInfo, int count = 0) where TEntity : class, IListItemEntity, new() { Check.NotNull(source, nameof(source)); if (!string.IsNullOrEmpty(pagingInfo)) { if (source is SpEntityQueryable <TEntity, ISpEntryDataContext> ) { var executor = (source as SpEntityQueryable <TEntity, ISpEntryDataContext>).GetExecutor(); if (executor != null) { var args = (SpQueryArgs <ISpEntryDataContext>)executor.SpQueryArgs.Clone(); var qParams = pagingInfo.ToLower().Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries) .Select(qParam => qParam.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries)) .ToDictionary(qParam => qParam.FirstOrDefault().Trim(), qParam => qParam.Length > 1 ? qParam.LastOrDefault().Trim() : null); args.IsPaged = qParams.ContainsKey("paged") /*&& qParams["paged"] == "true"*/; args.IsPagedPrev = qParams.ContainsKey("pagedprev") /*&& qParams["pagedprev"] == "true"*/; args.PagingInfo = pagingInfo; var provider = new SpEntityQueryable <TEntity>(args).Provider; source = new SpEntityQueryable <TEntity>(provider, source.Expression); if (count > 0) { source = source.Take(count); } } } } return(source); }
public static IQueryable <TEntity> Previous <TEntity>(this IQueryable <TEntity> source, int count = 0) where TEntity : class, IListItemEntity, new() { Check.NotNull(source, nameof(source)); if (source is SpEntityQueryable <TEntity, ISpEntryDataContext> ) { var executor = (source as SpEntityQueryable <TEntity, ISpEntryDataContext>).GetExecutor(); if (executor != null) { var args = (SpQueryArgs <ISpEntryDataContext>)executor.SpQueryArgs.Clone(); var firstItem = args.IsPaged && args.IsPagedPrev ? source.ToListItems().FirstOrDefault() : source.FirstListItem(); if (firstItem != null) { args.IsPaged = true; args.IsPagedPrev = true; var expression = new PagedExpression <ISpEntryDataContext>(source.Expression, args, firstItem, true); var provider = new SpEntityQueryable <TEntity>(args).Provider; source = new SpEntityQueryable <TEntity>(provider, source.Expression).Concat(new SpEntityQueryable <TEntity>(provider, expression)); if (count > 0) { source = source.Take(count); } } } } return(source); }