Я хотел бы создать фильтр на серверной части 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);
}
}
}