예제 #1
0
        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);
        }
예제 #2
0
 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);
 }
예제 #3
0
 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);
 }
예제 #4
0
 public static IQueryable <TEntity> WithQuery <TEntity>(this IQueryable <TEntity> source, string queryXml)
     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();
             args.Query = queryXml;
             source     = new SpEntityQueryable <TEntity>(new SpEntityQueryable <TEntity>(args).Provider, source.Expression);
         }
     }
     return(source);
 }
예제 #5
0
 public static IQueryable <TEntity> WithEvent <TEntity>(this IQueryable <TEntity> source, Action <Caml.View> onBefore, Action <string> onAfter)
     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();
             args.OnBeforeEvent = onBefore;
             args.OnAfterEvent  = onAfter;
             source             = new SpEntityQueryable <TEntity>(new SpEntityQueryable <TEntity>(args).Provider, source.Expression);
         }
     }
     return(source);
 }