.NET CORE MVC - динамический фильтр на основе данных пользователей? - PullRequest
0 голосов
/ 10 июня 2019

Я хотел бы создать фильтр на серверной части MVC-приложения .net core, который фильтрует данные из ОДНОЙ таблицы на основе динамических пользовательских данных ДРУГОЙ таблицы ...

Чтобы поместить это в контекст ... фильтр был бы эквивалентом амазонки, имеющей кнопку, чтобы скрыть все продукты, которые вы ранее купили ...

Теперь я знаю, что потенциально могу сделать что-то вроде: (возвращаясь к приведенному выше примеру для контекста) 1. Загрузите все предметы, которые купил пользователь. 2. Настройте запрос элемента магазина на основе любых других фильтров ... 3. прежде чем инициализировать запрос к элементам страницы, сравните идентификаторы купленных товаров с идентификаторами в запросе элементов и удалите все, которые соответствуют ...

Однако единственная проблема заключается в том, что для того, чтобы сделать приложение максимально быстрым, я (или хочу добавить) кеширую различные «запросы товаров», основанные на других значениях фильтра, которые ИСПРАВЛЕНЫ для всех пользователей и в группах. значений подкачки ... скажем, 50 пунктов одновременно ...

Вот мой код: (в настоящее время нет фильтрации, но добавлю ..)

        public async Task<IEnumerable<IcoSocialRewardDetailViewModel>> GetIcoRewards(IcoRewardSortFilterPageOptions options)
        {
            var rewards = _dbContext.IcoSocialRewards
                .AsNoTracking()
                .MapIcoSocialRewardToView()
                .OrderRewardsBy(options.OrderByOptions);

            options.SetupPaging(rewards);

            return await rewards.Page(options.PageNum - 1,
                                   options.PageSize).ToListAsync();
        }

public static class IcoSocialRewardListSelect
    {
        public static IQueryable<IcoSocialRewardDetailViewModel>
    MapIcoSocialRewardToView(this IQueryable<IcoSocialReward> rewards)
        {
            return rewards.Select(r => new IcoSocialRewardDetailViewModel
            {
                Id = r.Id,
                CurParticipants = r.CurParticipants,
                MaxParticipants = r.MaxParticipants,
                MaxSubmissions = r.MaxSubmissions,
                CustomTitle = r.CustomTitle,
                Description = r.Description,
                ParamName = r.ParamName,
                ReqUserParam = r.ReqUserParam,
                IcoInfoId = r.IcoInfoId,
                RewardParam = r.RewardParam,
                Tokens = r.Tokens,
                SocialRewardId = r.SocialRewardId,
                Blockchain = r.IcoInfo.TokenPlatform,
                ProjectDescription = r.IcoInfo.Description,
                ProjectLogo = r.IcoInfo.LogoUrl,
                IsFeatured = false,
                ProjectName = r.IcoInfo.Name,
                TokenTicker = r.IcoInfo.TokenTicker,
                SocialPlatform = r.SocialReward.Platform,
                IsActive = r.IcoInfo.IsActive && r.IcoInfo.IsLive,
                EndDate = r.IcoInfo.EndDate
            });
        }
    }

    public static class IcoSocialRewardListSort
    {
        public static IQueryable<IcoSocialRewardDetailViewModel> OrderRewardsBy
    (this IQueryable<IcoSocialRewardDetailViewModel> rewards,
     IcoRewardOrderByOptions orderByOptions)
        {
            switch (orderByOptions)
            {
                case IcoRewardOrderByOptions.SimpleOrder:
                    return rewards.OrderByDescending(
                        x => x.Id);
                case IcoRewardOrderByOptions.TokensAwardedAsc:
                    return rewards.OrderBy(x =>
                        x.Tokens);
                case IcoRewardOrderByOptions.TokensAwardedDec:
                    return rewards.OrderByDescending(
                        x => x.Tokens);
                case IcoRewardOrderByOptions.ByEndDate:
                    return rewards.OrderByDescending(
                        x => x.EndDate);
                case IcoRewardOrderByOptions.ByProject:
                    return rewards.OrderByDescending(
                        x => x.IcoInfoId);
                case IcoRewardOrderByOptions.BySocialPlatform:
                    return rewards.OrderBy(
                        x => x.SocialPlatform);
                case IcoRewardOrderByOptions.ByTokenTicker:
                    return rewards.OrderBy(
                        x => x.TokenTicker);
                default:
                    throw new ArgumentOutOfRangeException(
                        nameof(orderByOptions), orderByOptions, null);
            }
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...