public async Task <PagedPostResult> GetPosts(
            string blogId,
            string category,
            bool includeUnpublished,
            int pageNumber,
            int pageSize,
            CancellationToken cancellationToken = default(CancellationToken)
            )
        {
            cancellationToken.ThrowIfCancellationRequested();

            var posts = await GetAllPosts(blogId, cancellationToken).ConfigureAwait(false);

            var totalPosts = posts.Count;

            if (!string.IsNullOrEmpty(category))
            {
                posts = posts.Where(p =>
                                    (includeUnpublished || (p.IsPublished && p.PubDate <= DateTime.UtcNow)) &&
                                    p.Categories.Any(
                                        c => string.Equals(c, category, StringComparison.OrdinalIgnoreCase))
                                    )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                        .ToList <Post>();

                totalPosts = posts.Count;
            }
            else
            {
                posts = posts.Where(p =>
                                    (includeUnpublished || (p.IsPublished && p.PubDate <= DateTime.UtcNow))
                                    )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                        .ToList <Post>();
            }

            if (pageSize > 0)
            {
                var offset = 0;
                if (pageNumber > 1)
                {
                    offset = pageSize * (pageNumber - 1);
                }
                posts = posts.Skip(offset).Take(pageSize).ToList <Post>();
            }

            var data = new List <IPost>();

            data.AddRange(posts);

            var result = new PagedPostResult
            {
                Data       = data,
                TotalItems = totalPosts
            };

            return(result);
        }
        public async Task <PagedPostResult> GetPosts(
            string blogId,
            string category,
            bool includeUnpublished,
            int pageNumber,
            int pageSize,
            CancellationToken cancellationToken = default(CancellationToken)
            )
        {
            cancellationToken.ThrowIfCancellationRequested();

            int offset      = (pageSize * pageNumber) - pageSize;
            var currentTime = DateTime.UtcNow;

            var result = new PagedPostResult();

            using (var db = _contextFactory.CreateContext())
            {
                var query = db.Posts
                            .Include(p => p.PostComments)
                            .Where(x =>
                                   x.BlogId == blogId &&
                                   (includeUnpublished || (x.IsPublished == true && x.PubDate <= currentTime)) &&
                                   (string.IsNullOrEmpty(category) || x.CategoriesCsv.Contains(category))
                                   )
                            .OrderByDescending(x => x.PubDate ?? x.LastModified)
                ;

                var posts = await query
                            .AsNoTracking()
                            .Skip(offset)
                            .Take(pageSize)
                            .ToListAsync <IPost>(cancellationToken)
                            .ConfigureAwait(false);

                int totalPosts = await GetCount(blogId, category, includeUnpublished, cancellationToken).ConfigureAwait(false);

                result.Data       = posts;
                result.TotalItems = totalPosts;

                return(result);
            }
        }
        public async Task <PagedPostResult> GetPosts(
            string blogId,
            int year,
            int month                           = 0,
            int day                             = 0,
            int pageNumber                      = 1,
            int pageSize                        = 10,
            bool includeUnpublished             = false,
            CancellationToken cancellationToken = default(CancellationToken)
            )
        {
            cancellationToken.ThrowIfCancellationRequested();
            var posts = await GetAllPosts(blogId, cancellationToken).ConfigureAwait(false);

            var totalItems = posts.Count;

            if (day > 0 && month > 0)
            {
                posts = posts.Where(x =>
                                    x.PubDate.HasValue &&
                                    x.PubDate.Value.Year == year &&
                                    x.PubDate.Value.Month == month &&
                                    x.PubDate.Value.Day == day &&
                                    (includeUnpublished || (x.IsPublished &&
                                                            x.PubDate <= DateTime.UtcNow))
                                    )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                        .ToList <Post>();
            }
            else if (month > 0)
            {
                posts = posts.Where(x =>
                                    x.PubDate.HasValue &&
                                    x.PubDate.Value.Year == year &&
                                    x.PubDate.Value.Month == month &&
                                    (includeUnpublished || (x.IsPublished &&
                                                            x.PubDate <= DateTime.UtcNow))
                                    )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                        .ToList <Post>();
            }
            else
            {
                posts = posts.Where(x =>
                                    x.PubDate.HasValue &&
                                    x.PubDate.Value.Year == year
                                    )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                        .ToList <Post>();
            }

            if (pageSize > 0)
            {
                var offset = 0;
                if (pageNumber > 1)
                {
                    offset = pageSize * (pageNumber - 1);
                }
                posts = posts.Skip(offset).Take(pageSize).ToList <Post>();
            }

            var result = new PagedPostResult();

            var data = new List <IPost>();

            data.AddRange(posts);

            result.Data       = data;
            result.TotalItems = totalItems;

            return(result);
        }
Пример #4
0
        public async Task <PagedPostResult> GetPosts(
            string blogId,
            int year,
            int month                           = 0,
            int day                             = 0,
            int pageNumber                      = 1,
            int pageSize                        = 10,
            bool includeUnpublished             = false,
            CancellationToken cancellationToken = default(CancellationToken)
            )
        {
            cancellationToken.ThrowIfCancellationRequested();

            IQueryable <PostEntity> query;
            var currentTime = DateTime.UtcNow;

            if (day > 0 && month > 0)
            {
                query = _dbContext.Posts
                        .Include(p => p.PostComments)
                        .Where(x =>
                               x.BlogId == blogId &&
                               x.PubDate.HasValue &&
                               x.PubDate.Value.Year == year &&
                               x.PubDate.Value.Month == month &&
                               x.PubDate.Value.Day == day &&
                               (includeUnpublished || (x.IsPublished == true && x.PubDate <= currentTime))
                               )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                ;
            }
            else if (month > 0)
            {
                query = _dbContext.Posts
                        .Include(p => p.PostComments)
                        .Where(x =>
                               x.BlogId == blogId &&
                               x.PubDate.HasValue &&
                               x.PubDate.Value.Year == year &&
                               x.PubDate.Value.Month == month &&
                               (includeUnpublished || (x.IsPublished == true && x.PubDate <= currentTime))
                               )
                        .OrderByDescending(p => p.PubDate ?? p.LastModified)
                ;
            }
            else
            {
                query = _dbContext.Posts
                        .Include(p => p.PostComments)
                        .Where(x =>
                               x.BlogId == blogId &&
                               x.PubDate.HasValue &&
                               x.PubDate.Value.Year == year
                               ).OrderByDescending(p => p.PubDate ?? p.LastModified)
                ;
            }

            int offset = (pageSize * pageNumber) - pageSize;
            var posts  = await query
                         .AsNoTracking()
                         .Skip(offset)
                         .Take(pageSize)
                         .ToListAsync <IPost>();

            var result = new PagedPostResult();

            result.Data       = posts;
            result.TotalItems = await GetCount(blogId, year, month, day, includeUnpublished, cancellationToken).ConfigureAwait(false);

            return(result);
        }