public async Task <IActionResult> GetExpirationDates([FromQuery] ExpirationDatesFilterParams filterParams) { Expression <Func <ExpirationDate, object> >[] includings = new Expression <Func <ExpirationDate, object> > [2]; if (filterParams.WithEmployees) { includings[0] = x => x.CollectedBy; } if (filterParams.WithProducts) { includings[1] = x => x.Product; } string userIdToFilter = (User.IsInRole("Admin") || User.IsInRole("Manager")) ? null : (await _userManager.GetUserAsync(User)).Id; PagedList <ExpirationDate> paginatedExpirationDates = await _repo.GetPaginated(filterParams.ExpirationDatesFiltersAsOneExpression(userIdToFilter), dbSet => dbSet.OrderBy(exp => exp.Collected ? 1 : 0).ThenBy(exp => exp.EndDate), filterParams, includings); Response.AddPagination(paginatedExpirationDates.CurrentPage, paginatedExpirationDates.PageSize, paginatedExpirationDates.TotalCount, paginatedExpirationDates.TotalPages); return(Ok(_mapper.Map <IEnumerable <ExpirationDateVM> >(paginatedExpirationDates.Items))); }
public static Expression <Func <ExpirationDate, bool> > ExpirationDatesFiltersAsOneExpression(this ExpirationDatesFilterParams filterParams, string userIdToFilter) { Expression <Func <ExpirationDate, bool> > exprBase = PredicateBuilder.New <ExpirationDate>(true); if (!String.IsNullOrEmpty(filterParams.Barecode)) { exprBase = exprBase.And(exp => exp.Product.Barecode.Contains(filterParams.Barecode)); } if (!String.IsNullOrEmpty(filterParams.ProductName)) { exprBase = exprBase.And(exp => EF.Functions.Like(exp.Product.Name, "%" + filterParams.ProductName + "%")); } if (filterParams.CategoriesIds != null) { Expression <Func <ExpirationDate, bool> > innerBase = PredicateBuilder.New <ExpirationDate>(false); foreach (var categoryId in filterParams.CategoriesIds) { innerBase = innerBase.Or(exp => exp.Product.CategoryId == categoryId); } exprBase = exprBase.And(innerBase); } if (!filterParams.IncludeCollected) { exprBase = exprBase.And(exp => !exp.Collected); } if (filterParams.ProductId > 0) { exprBase = exprBase.And(exp => exp.ProductId == filterParams.ProductId); } if (userIdToFilter != null) { exprBase = exprBase.And(exp => exp.Product.Category.CategoryUsers.Any(u => u.UserId == userIdToFilter)); } return(exprBase); }