public static PagedListResult <TOutput> PaginateListResult <TInput, TOutput>(
            this IQueryable <TInput> queriable,
            OffsetBasedContinuationToken continuationToken,
            int pageSize,
            Func <TInput, TOutput> conversion)
        {
            int offset = Math.Clamp(continuationToken.Offset, 0, int.MaxValue);
            var list   = queriable.Skip(offset)
                         .Take(pageSize + 1)
                         .ToList()
                         .Select(x => conversion(x))
                         .Where(x => x != null)
                         .ToList();

            OffsetBasedContinuationToken token = null;

            if (list.Count > pageSize)
            {
                token = new OffsetBasedContinuationToken
                {
                    Offset = offset + pageSize,
                };
                list.RemoveAt(list.Count - 1); // keep it for the next page
            }
            return(new PagedListResult <TOutput> {
                Items = list, ContinuationToken = token?.IntoToken()
            });
        }
        public Task <PagedListResult <ClassifiedUserSearchResultItem> > FindClassifiedUsersByEmailAsync2(string email, string continuationToken)
        {
            var query = appDBContext_.Users
                        .Where(x => x.NormalizedEmail.Contains(userManager_.NormalizeEmail(email)))
                        .OrderBy(x => x.NormalizedEmail);

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x.ToClassifiedUserSearchResultItem()));
        }
        public Task <PagedListResult <ClassifiedUserInfo> > FindClassifiedUsersByEmailAsync(string email, string continuationToken)
        {
            var query = appDBContext_.UserSearch()
                        .Where(x => x.Email.Contains(email))
                        .OrderBy(x => x.AccountId);

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x.ToClassifiedUserInfo()));
        }
        public Task <PagedListResult <ClassifiedUserInfo> > DeprecatedFindClassifiedUsersByNameAsync(string name, string continuationToken)
        {
            var query = appDBContext_.UserSearch()
                        .Where(x => x.NormalizedName.Contains(userManager_.NormalizeName(name)))
                        .OrderBy(x => x.NormalizedName);

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x.ToClassifiedUserInfo()));
        }
        private Task <PagedListResult <DBHardDeletedUserAccount> > GetHardDeletedUsers(string continuationToken)
        {
            var query = from dbDeletedUser in appDBContext_.HardDeletedUserAccounts
                        orderby dbDeletedUser.TimeStamp ascending
                        select dbDeletedUser;

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x));
        }
        public Task <PagedListResult <ClassifiedUserSearchResultItem> > FindClassifiedUsersByNameAsync(string name, string continuationToken)
        {
            var query = from user in appDBContext_.Users
                        where user.NormalizedUserName.Contains(userManager_.NormalizeName(name))
                        orderby user.NormalizedUserName
                        select user;

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x.ToClassifiedUserSearchResultItem()));
        }
        private Task <PagedListResult <DBSoftDeletedUserAccount> > GetUsersToHardDeleteAsync(string continuationToken)
        {
            var hardDeletionDelay = configuration_.IsProductionSlot() ? TimeSpan.FromDays(7) : TimeSpan.FromMinutes(5);
            var threshold         = DateTime.UtcNow.Subtract(hardDeletionDelay);

            var query = from dbDeletedUser in appDBContext_.SoftDeletedUserAccounts
                        where dbDeletedUser.TimeStamp < threshold
                        orderby dbDeletedUser.TimeStamp ascending
                        select dbDeletedUser;

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x));
        }
        public Task <PagedListResult <ClassifiedUserInfo> > FindClassifiedUsersByRoleAsync(IEnumerable <string> roleList, string continuationToken)
        {
            if (!roleList.Any())
            {
                throw new ArgumentException("Should provide roleList", nameof(roleList));
            }

            var query = appDBContext_.UserSearch();

            foreach (var r in roleList)
            {
                query = query.Where(x => x.Roles.Contains(r));
            }
            query = query.OrderBy(x => x.AccountId);

            var token = new OffsetBasedContinuationToken(continuationToken);

            return(query.PaginateListResultAsync(token, 20, x => x.ToClassifiedUserInfo()));
        }