// Lists Jobs with a given field matching a given value
        public IActionResult Cosmetics(CosmeticFieldType column, string value)
        {
            SearchCosmeticsViewModel searchVM = new SearchCosmeticsViewModel();

            searchVM.Cosmetics = context.FindByColumnAndValue(column, value);
            searchVM.Title     = "Cosmetics with " + column + ": " + value;

            return(View(searchVM));
        }
        public IActionResult Values(CosmeticFieldType column)
        {
            if (column.Equals(CosmeticFieldType.All))
            {
                SearchCosmeticsViewModel searchVM = new SearchCosmeticsViewModel();
                searchVM.Cosmetics = context.Cosmetics.ToList();
                searchVM.Title     = "All Cosmetics";
                return(View("Cosmetics", searchVM));
            }
            else
            {
                CosmeticListViewModel listVM = new CosmeticListViewModel();

                IEnumerable <CosmeticField> fields;
                // List<CosmeticField> fields;

                switch (column)
                {
                case CosmeticFieldType.Finish:
                    fields = context.Finishs.ToList().Cast <CosmeticField>();
                    break;

                case CosmeticFieldType.Formulation:
                    fields = context.Formulations.ToList().Cast <CosmeticField>();
                    break;

                case CosmeticFieldType.Rating:
                    fields = context.Ratings.ToList().Cast <CosmeticField>();
                    break;

                case CosmeticFieldType.SkinType:
                    fields = context.SkinTypes.ToList().Cast <CosmeticField>();
                    break;

                case CosmeticFieldType.Color:
                default:
                    fields = context.Colors.ToList().Cast <CosmeticField>();
                    break;
                }

                listVM.Fields = fields;
                listVM.Title  = "All " + column + " Values";
                listVM.Column = column;

                return(View(listVM));
            }
        }
        /**
         * Returns results of search the jobs data by key/value, using
         * inclusion of the search term.
         */
        public List <Cosmetic> FindByColumnAndValue(CosmeticFieldType column, string value)
        {
            IList <Cosmetic> cosmetics = Cosmetics
                                         .Include(f => f.Finish)
                                         .Include(c => c.Color)
                                         .Include(c => c.Formulation)
                                         .Include(r => r.Rating)
                                         .Include(s => s.SkinType)
                                         .ToList();


            var results = from j in cosmetics
                          where GetFieldByType(j, column).Contains(value)
                          select j;

            return(results.ToList());
        }
        /**
         * Returns the JobField of the given type from the Job object,
         * for all types other than JobFieldType.All. In this case,
         * null is returned.
         */
        public static CosmeticField GetFieldByType(Cosmetic cosmetic, CosmeticFieldType type)
        {
            switch (type)
            {
            case CosmeticFieldType.Color:
                return(cosmetic.Color);

            case CosmeticFieldType.Finish:
                return(cosmetic.Finish);

            case CosmeticFieldType.Formulation:
                return(cosmetic.Formulation);

            case CosmeticFieldType.Rating:
                return(cosmetic.Rating);

            case CosmeticFieldType.SkinType:
                return(cosmetic.SkinType);
            }

            throw new ArgumentException("Cannot get field of type: " + type);
        }