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);
        }