protected override IQueryable <IndexViewModel> ApplyFiltering(IQueryable <IndexViewModel> chainQuery,
                                                                          IFilterParam filterParam)
            {
                UpdateResult filterKey;

                Enum.TryParse(filterParam.FilterKey, true, out filterKey);

                switch (filterKey)
                {
                case UpdateResult.None:
                    break;

                case UpdateResult.Error:
                    chainQuery = chainQuery.Where(x => x.UpdateResult == UpdateResult.Error);
                    break;

                case UpdateResult.Success:
                    chainQuery = chainQuery.Where(x => x.UpdateResult == UpdateResult.Success);
                    break;

                case UpdateResult.NeedManualResolve:
                    chainQuery = chainQuery.Where(x => x.UpdateResult == UpdateResult.NeedManualResolve);
                    break;

                case UpdateResult.Resolved:
                    chainQuery = chainQuery.Where(x => x.UpdateResult == UpdateResult.Resolved);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                return(chainQuery);
            }
            protected override async Task InitializeFilterSelectList(IQueryable <IndexViewModel> chainQuery,
                                                                     IFilterParam filterParam)
            {
                const string all = "All Training Providers";

                var selectedTrainingProvider = filterParam.FilterKey ?? all;

                var availableTrainingProviders = await InputQuery.Select(x => x.TrainingProviderName)
                                                 .Distinct()
                                                 .ToListAsync();

                FilterSelectList = availableTrainingProviders
                                   .Select(x => new SelectListItem
                {
                    Text     = x,
                    Value    = x,
                    Selected = x == selectedTrainingProvider
                }).Concat(new[]
                {
                    new SelectListItem
                    {
                        Text     = all,
                        Value    = string.Empty,
                        Selected = selectedTrainingProvider == all
                    }
                });
            }
            protected override IQueryable <IndexViewModel> ApplyFiltering(IQueryable <IndexViewModel> chainQuery,
                                                                          IFilterParam filterParam)
            {
                var selectedTrainingProviderName = filterParam.FilterKey;

                if (string.IsNullOrWhiteSpace(selectedTrainingProviderName))
                {
                    return(chainQuery);
                }

                chainQuery = chainQuery.Where(x => x.TrainingProviderName == selectedTrainingProviderName);

                return(chainQuery);
            }
            protected override Task InitializeFilterSelectList(IQueryable <IndexViewModel> chainQuery,
                                                               IFilterParam filterParam)
            {
                UserFilter filterKey;

                Enum.TryParse(filterParam.FilterKey, true, out filterKey);

                FilterSelectList = new[]
                {
                    new SelectListItem
                    {
                        Value    = UserFilter.None.ToString(),
                        Text     = "Filter not applyed",
                        Selected = filterKey == UserFilter.None
                    },
                    new SelectListItem
                    {
                        Value    = UserFilter.InAdministratorRole.ToString(),
                        Text     = "Display Administrators",
                        Selected = filterKey == UserFilter.InAdministratorRole
                    },
                    new SelectListItem
                    {
                        Value    = UserFilter.LockoutEnabled.ToString(),
                        Text     = "Display Users With Lockout Enabled",
                        Selected = filterKey == UserFilter.LockoutEnabled
                    },
                    new SelectListItem
                    {
                        Value    = UserFilter.LockoutDisabled.ToString(),
                        Text     = "Display Users With Lockout Disabled",
                        Selected = filterKey == UserFilter.LockoutDisabled
                    },
                    new SelectListItem
                    {
                        Value    = UserFilter.LockedUsers.ToString(),
                        Text     = "Display Locked Users",
                        Selected = filterKey == UserFilter.LockedUsers
                    }
                };

                return(Task.FromResult(true));
            }
            protected override Task InitializeFilterSelectList(IQueryable <IndexViewModel> chainQuery,
                                                               IFilterParam filterParam)
            {
                UpdateResult filterKey;

                Enum.TryParse(filterParam.FilterKey, true, out filterKey);

                FilterSelectList = new[]
                {
                    new SelectListItem
                    {
                        Value    = UpdateResult.None.ToString(),
                        Text     = "Filter not applyed",
                        Selected = filterKey == UpdateResult.None
                    },
                    new SelectListItem
                    {
                        Value    = UpdateResult.Success.ToString(),
                        Text     = "Display Succeeded",
                        Selected = filterKey == UpdateResult.Success
                    },
                    new SelectListItem
                    {
                        Value    = UpdateResult.Error.ToString(),
                        Text     = "Display Failed",
                        Selected = filterKey == UpdateResult.Error
                    },
                    new SelectListItem
                    {
                        Value    = UpdateResult.NeedManualResolve.ToString(),
                        Text     = "Display Not Resolved",
                        Selected = filterKey == UpdateResult.NeedManualResolve
                    },
                    new SelectListItem
                    {
                        Value    = UpdateResult.Resolved.ToString(),
                        Text     = "Display Resolved",
                        Selected = filterKey == UpdateResult.Resolved
                    }
                };

                return(Task.FromResult(true));
            }
            protected override IQueryable <IndexViewModel> ApplyFiltering(
                IQueryable <IndexViewModel> chainQuery, IFilterParam filterParam)
            {
                UserFilter filterKey;

                Enum.TryParse(filterParam.FilterKey, true, out filterKey);

                switch (filterKey)
                {
                case UserFilter.None:
                    break;

                case UserFilter.InAdministratorRole:
                    chainQuery = chainQuery.Where(x => x.IsAdmin);
                    break;

                case UserFilter.LockoutEnabled:
                    chainQuery = chainQuery.Where(x => x.LockoutEnabled);
                    break;

                case UserFilter.LockoutDisabled:
                    chainQuery = chainQuery.Where(x => !x.LockoutEnabled);
                    break;

                case UserFilter.LockedUsers:
                    chainQuery =
                        chainQuery.Where(
                            x =>
                            x.LockoutEndDateUtc.HasValue &&
                            SqlFunctions.DateDiff("second", SqlFunctions.GetUtcDate(), x.LockoutEndDateUtc) > 0);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                return(chainQuery);
            }
 protected abstract Task InitializeFilterSelectList(IQueryable <TModel> chainQuery, IFilterParam filterParam);
 protected abstract IQueryable <TModel> ApplyFiltering(IQueryable <TModel> chainQuery, IFilterParam filterParam);