public static List<SearchResutPartialViewItem> GetSearchResult(SearchViewModel svm) { Form115Entities db = new Form115Entities(); // Search et SearchOption héritent de SearchBase SearchBase s = new Search(); s = new SearchOptionDestination(s, svm.Continent, svm.Region, svm.Pays, svm.Ville); //s = new SearchOptionDateDepart(s, svm.DateDepart); s = new SearchOptionDuree(s, svm.Duree); s = new SearchOptionNbPers(s, svm.NbPers); s = new SearchOptionCategorie(s, svm.Categorie); s = new SearchOptionPrixMax(s, svm.PrixMax); s = new SearchOptionPrixMin(s, svm.PrixMin); // Intégration de DateDepart > DateTime.Now ici car on n'est pas intéressé par un produit périmé return s.GetResult() .Where(p => p.DateDepart >= DateTime.Now) .GroupBy(p => p.Sejours.Hotels.IdHotel, p => p, (key, g) => new SearchResutPartialViewItem { Hotel = db.Hotels.Where(h => h.IdHotel == key).FirstOrDefault(), Produits = g.ToList() }) .ToList(); }
public JsonResult listeProduits(HotelViewModel hvm) { SearchBase s = new Search(); if (hvm.DateIndifferente == null) { if (hvm.DateMarge == null) { s = new SearchOptionDateDepart(s, hvm._dateDepart, hvm._dateDepart); } else { s = new SearchOptionDateDepart(s, hvm._dateDepart, hvm._dateDepart.AddDays((double)hvm.DateMarge)); } } s = new SearchOptionAPartirDAujourdHui(s); // TODO Attention ici il peut n'y avoir qu'une seule renseignée s = new SearchOptionDuree(s, hvm.DureeMini, hvm.DureeMaxi); s = new SearchOptionNbPers(s, hvm.NbPers); s = new SearchOptionPrixMax(s, hvm.PrixMaxi); s = new SearchOptionPrixMin(s, hvm.PrixMini); //var prods = _db.Produits.Where(p => p.Sejours.IdHotel == hvm.IdHotel) // .Where(p=>p.Sejours.Duree >= hvm.DureeMinSejour) ; //// TODO Attention aux filtres concurents pour le dateDebut //if (hvm.DureeMaxSejour != null) { // prods = prods.Where(p=>p.Sejours.Duree<=hvm.DureeMaxSejour) ; //} //if (hvm._dateDepart!=null) { // prods = prods.Where(p=>p.DateDepart >= hvm._dateDepart) ; //} ////if (hvm._dateDebut != null) ////{ // prods = prods.Where(p => p.DateDepart >= hvm._dateDebut); ////} //////if (hvm._dateFin != null) ////{ // prods = prods.Where(p => p.DateDepart <= hvm._dateFin); ////} // if (hvm.NbPers >= 0) // { // prods = prods.Where(p => ((p.NbPlaces - (p.Reservations.Count() != 0 ? p.Reservations.Sum(r => r.Quantity) : 0)) >= hvm.NbPers)); // } // HACK AsEnumerable avant le select ? Sinon ATTENTION, le nb_restants ne sera // pas à jour pour les prouits n'ayant pas de réservation, nécessite opérateur ternaire poutr jointure externe // TODO : decorator pour l'hôtelk afin de le placer en premier var result = s.GetResult().Where(p => p.Sejours.Hotels.IdHotel == hvm.IdHotel) .AsEnumerable() .Select(p => new { date = p.DateDepart.ToString("dd/MM/yyyy"), duree = p.Sejours.Duree, prix = p.Prix, promotions = p.Promotion, prixSolde = p.PrixSolde, nb_restants = p.NbPlaces - p.Reservations.Sum(r => r.Quantity), sejour =p.IdProduit } ); return Json(result, JsonRequestBehavior.AllowGet); }