static async Task <FetchRowsResult> FetchRowsAsync(FetchRowsAsyncEventArgs e)
        {
            IssueSortOrder sortOrder = GetIssueSortOrder(e);
            IssueFilter    filter    = MakeIssueFilter(e.Filter);

            int take   = e.Take ?? 30;
            var issues = await IssuesService.GetIssuesAsync(
                skip : e.Skip,
                take : take,
                sortOrder : sortOrder,
                filter : filter);

            return(new FetchRowsResult(issues, hasMoreRows: issues.Length == take));
        }
        static void CheckRestrictions(IssueSortOrder sortOrder, IssueFilter filter)
        {
            if (filter == null)
            {
                return;
            }
            if ((sortOrder == IssueSortOrder.Hot || sortOrder == IssueSortOrder.Week) &&
                (filter.CreatedFrom != null || filter.CreatedTo != null || filter.MaxVotes != null || filter.MinVotes != null))
            {
                throw new InvalidOperationException("Restrictions violation");
            }

            if ((filter.MaxVotes != null || filter.MinVotes != null) &&
                !(sortOrder == IssueSortOrder.VotesAscending || sortOrder == IssueSortOrder.VotesDescending))
            {
                throw new InvalidOperationException("Restrictions violation");
            }
        }
 static IEnumerable <IssueData> FilterIssues(IssueFilter filter, IEnumerable <IssueData> issues)
 {
     if (filter.CreatedFrom != null)
     {
         issues = issues.Where(x => x.Created >= filter.CreatedFrom.Value);
     }
     if (filter.CreatedTo != null)
     {
         issues = issues.Where(x => x.Created < filter.CreatedTo.Value);
     }
     if (filter.MinVotes != null)
     {
         issues = issues.Where(x => x.Votes >= filter.MinVotes.Value);
     }
     if (filter.MaxVotes != null)
     {
         issues = issues.Where(x => x.Votes <= filter.MaxVotes.Value);
     }
     if (!string.IsNullOrEmpty(filter.Tag))
     {
         issues = issues.Where(x => x.Tags.Contains(filter.Tag));
     }
     return(issues);
 }
        public async static Task <IssueData[]> GetIssuesAsync(int skip, int take, IssueSortOrder sortOrder, IssueFilter filter)
        {
            await Task.Delay(300).ConfigureAwait(false);

            CheckRestrictions(sortOrder, filter);
            var issues = SortIssues(sortOrder, AllIssues.Value);

            if (filter != null)
            {
                issues = FilterIssues(filter, issues);
            }
            return(issues.Skip(skip).Take(take).ToArray());
        }