public IEnumerable<PostViewModel> RecentPosts(int pageNumber, int pageSize, int? categoryId, DateTime? startDate, DateTime? endDate)
{
Condition.Requires(pageNumber, "pageNumber").IsGreaterOrEqual(0);
Condition.Requires(pageSize, "pageSize").IsLessOrEqual(ServiceConstants.MaximumPageSize+1);
Condition.Requires(pageSize, "pageSize").IsGreaterThan(0);
Post[] posts = null;
using(IUnitOfWork unitOfWork = _unitOfWorkFactory.Create())
{
unitOfWork.Execute(() =>
{
IRepository<Post> repository = unitOfWork.GetRepository<Post>();
IQueryable<Post> query = repository.AllIncluding(x => x.Categories, x => x.Author);
if (categoryId.HasValue)
{
query = query.Where(x => x.Categories.Any(c => c.CategoryID == categoryId.Value));
}
if (startDate.HasValue)
{
query = query.Where(x => x.PostedAt >= startDate.Value);
}
if (endDate.HasValue)
{
query = query.Where(x => x.PostedAt <= endDate.Value);
}
posts = query
.OrderByDescending(x => x.PostedAt)
.Skip(pageNumber*pageSize)
.Take(pageSize+1)
.ToArray();
});
}
return posts.Select(x => _postMapper.Map(x)).ToArray();
}