public bool ExecuteSet()
        {
            bool found = false;

            IList <Garment> garmentsA = (from g in lstGarments
                                         where g.Tags.Silouhette.Layers.Contains(LayerCode.A)
                                         select g).ToList();
            IList <Garment> garmentsC = (from g in lstGarments
                                         where g.Tags.Silouhette.Layers.Contains(LayerCode.C)
                                         select g).ToList();
            IList <Garment> garmentsD = (from g in lstGarments
                                         where g.Tags.Silouhette.Layers.Contains(LayerCode.D)
                                         select g).ToList();

            IList <Garment> garmentsAii = (from g in lstGarments
                                           where g.Tags.Silouhette.Layers.Contains(LayerCode.Aii)
                                           select g).ToList();

            IList <Garment> garmentsAi = (from g in lstGarments
                                          where g.Tags.Silouhette.Layers.Contains(LayerCode.Ai)
                                          select g).ToList();

            IList <Garment> garmentsB =
                (from g in lstGarments where g.Tags.Silouhette.Layers.Contains(LayerCode.B) select g).ToList();
            IList <Garment> garmentsCD = (from g in lstGarments
                                          where g.Tags.Silouhette.Layers.Contains(LayerCode.C) ||
                                          g.Tags.Silouhette.Layers.Contains(LayerCode.D)
                                          select g).ToList();
            IList <Garment> garmentsBCD = (from g in lstGarments
                                           where g.Tags.Silouhette.Layers.Contains(LayerCode.C) ||
                                           g.Tags.Silouhette.Layers.Contains(LayerCode.D) ||
                                           g.Tags.Silouhette.Layers.Contains(LayerCode.B)
                                           select g).ToList();

            //  A + B, A+C, A+D
            IEnumerable <Combination> comb = Combine(2, garmentsA, garmentsBCD, null, null, null);

            //  Ai + Aii
            IEnumerable <Combination> combAiAii = Combine(2, garmentsAi, garmentsAii, null, null, null);

            // A+B+C, A+B+D
            IEnumerable <Combination> combABC_D = Combine(3, garmentsA, garmentsB, garmentsCD, null, null);

            // A+C+D
            IEnumerable <Combination> combACD = Combine(3, garmentsA, garmentsC, garmentsD, null, null);

            // Ai + Aii + B, Ai + Aii + C, Ai + Aii + D
            IEnumerable <Combination> combAii = Combine(3, garmentsAi, garmentsAii, garmentsBCD, null, null);

            // A+B+C+D
            IEnumerable <Combination> combABCD = Combine(4, garmentsA, garmentsB, garmentsC, garmentsD, null);

            // Ai + Aii + B + C, Ai + Aii + C + D
            IEnumerable <Combination> combAiAiiBC = Combine(4, garmentsAi, garmentsAii, garmentsB, garmentsC, null);
            IEnumerable <Combination> combAiAiiCD = Combine(4, garmentsAi, garmentsAii, garmentsC, garmentsD, null);

            // Ai + Aii + B + C + D
            IEnumerable <Combination> combAiAiiBCD = Combine(5, garmentsAi, garmentsAii, garmentsB, garmentsC, garmentsD);

            // Find accesories
            List <Garment> linqAccesories1 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC1)
                                              select g).ToList();

            List <Garment> linqAccesories2 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC2)
                                              select g).ToList();

            List <Garment> linqAccesories3 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC3)
                                              select g).ToList();

            List <Garment> linqAccesories4 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC4)
                                              select g).ToList();

            List <Garment> linqAccesories5 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC5)
                                              select g).ToList();

            List <Garment> linqAccesories6 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC6)
                                              select g).ToList();

            List <Garment> linqAccesories7 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC7)
                                              select g).ToList();

            List <Garment> linqAccesories8 = (from g in lstAccesories
                                              where g.Tags.Silouhette.Layers.Contains(LayerCode.ACC8)
                                              select g).ToList();

            accesories1 = Combine(1, linqAccesories1, null, null, null, null);
            accesories2 = Combine(2, linqAccesories1, linqAccesories2, null, null, null);

            accesories23 = Combine(2, linqAccesories1, linqAccesories3, null, null, null);
            accesories24 = Combine(2, linqAccesories1, linqAccesories4, null, null, null);
            accesories25 = Combine(2, linqAccesories1, linqAccesories5, null, null, null);
            accesories26 = Combine(2, linqAccesories1, linqAccesories6, null, null, null);
            accesories27 = Combine(2, linqAccesories1, linqAccesories7, null, null, null);
            accesories28 = Combine(2, linqAccesories1, linqAccesories8, null, null, null);

            accesories3 = Combine(3, linqAccesories1, linqAccesories2, linqAccesories3, null, null);
            accesories4 = Combine(4, linqAccesories1, linqAccesories2, linqAccesories3, linqAccesories4, null);
            accesories5 = Combine(5, linqAccesories1, linqAccesories2, linqAccesories3, linqAccesories4, linqAccesories5);
            accesories6 = Combine(6, linqAccesories1, linqAccesories2, linqAccesories3, linqAccesories4, linqAccesories5,
                                  linqAccesories6, null, null);
            accesories7 = Combine(7, linqAccesories1, linqAccesories2, linqAccesories3, linqAccesories4, linqAccesories5,
                                  linqAccesories6, linqAccesories7, null);
            accesories8 = Combine(8, linqAccesories1, linqAccesories2, linqAccesories3, linqAccesories4, linqAccesories5,
                                  linqAccesories6, linqAccesories7, linqAccesories8);

            if (createRecords)
            {
                _closetRepository.DbContext.BeginTransaction();
                Closet.StartProcessing();
                _closetRepository.SaveOrUpdate(Closet);
                _closetRepository.DbContext.CommitTransaction();
            }

            foreach (FashionFlavor fv in currentFlavors)
            {
                logger.DebugFormat("Started Flavor {0}.", fv.Name);

                currentFlavor = fv;

                IEnumerable <StyleRule> styleRule = from s in lstStyleRules
                                                    where s.FashionFlavor.Id == fv.Id
                                                    select s;

                currentStyleRule = styleRule.First();

                for (int i = currentStyleRule.MinimumLayers; i <= currentStyleRule.MaximumLayers; i++)
                {
                    bool recordsFound = false;
                    logger.DebugFormat("Started Layers {0}", i);
                    switch (i)
                    {
                    case 2:

                        recordsFound = ExcludeCombinations(currentStyleRule, comb);

                        recordsFound = recordsFound || ExcludeCombinations(currentStyleRule, combAiAii);

                        break;

                    case 3:

                        recordsFound = ExcludeCombinations(currentStyleRule, combABC_D);


                        recordsFound = recordsFound || ExcludeCombinations(currentStyleRule, combACD);


                        recordsFound = recordsFound || ExcludeCombinations(currentStyleRule, combAii);

                        break;

                    case 4:
                        recordsFound = ExcludeCombinations(currentStyleRule, combABCD);

                        recordsFound = recordsFound || ExcludeCombinations(currentStyleRule, combAiAiiBC);

                        recordsFound = recordsFound || ExcludeCombinations(currentStyleRule, combAiAiiCD);

                        break;

                    case 5:

                        recordsFound = ExcludeCombinations(currentStyleRule, combAiAiiBCD);

                        break;
                    }

                    // No need to continue to check.
                    if (!createRecords && recordsFound)
                    {
                        return(recordsFound);
                    }

                    found = found || recordsFound;
                }
            }

            if (createRecords)
            {
                _closetRepository.DbContext.BeginTransaction();
                if (found && Closet.FavoriteOutfit == null)
                {
                    logger.DebugFormat("Setting default favorite");
                    int outfitId = _closetRepository.GetBestEditorRatedClosetOutfitId(Closet.Id);
                    Closet.SetFavoriteOutfit(new ClosetOutfit(outfitId));
                }
                Closet.MarkAsProcessed();
                _closetRepository.SaveOrUpdate(Closet);
                _closetRepository.DbContext.CommitTransaction();

                if (found)
                {
                    logger.DebugFormat("Adding outfit updaters");
                    _outfitUpdaterService.MatchOutfitUpdatersForCloset(Closet.Id);
                    logger.DebugFormat("Finish adding outfit updaters");
                }
            }

            return(found);
        }