public async Task <BasePaginatedResponse <WorkItemDto> > Paginate(int projectId, WorkItemQueryParameters parameters) { Expression <Func <WorkItem, bool> > exp = w => w.ProjectId == projectId; if (parameters.AssigneeId.HasValue) { exp = exp.AndAlso(w => w.AssigneeId == parameters.AssigneeId.Value); } if (!string.IsNullOrWhiteSpace(parameters.Search)) { exp = exp.AndAlso(w => w.Title.Contains(parameters.Search)); } var workItemList = await _workItemRepository.PaginateFiltered( exp, offset : (parameters.Page - 1) *parameters.ItemsPerPage, itemsCount : parameters.ItemsPerPage ); var workItemDtoList = _mapper.Map <IEnumerable <WorkItem>, IEnumerable <WorkItemDto> >(workItemList); var rowsCount = await _workItemRepository.GetFilteredDataCountAsync(exp); var pagesCount = (int)Math.Ceiling((decimal)rowsCount / parameters.ItemsPerPage); return(new BasePaginatedResponse <WorkItemDto> { EntityList = workItemDtoList, PagesCount = pagesCount }); }