2016-01-16 1 views
0

J'ai utilisé Entity Framework 5. J'avais un hôtel de table qui avait une collection de roomTypes.MVC EF première requête résultat est remplacé par deuxième résultat si le deuxième résultat obtenu le même enregistrement

Lorsque j'ai voulu trouver quel hôtel avait les roomTypes suivants en bouclant la fonction pour chaque roomType et fusionné le résultat. Le premier résultat a été remplacé par le deuxième résultat s'il contenait le même enregistrement.

Model 
public class Hotel { 
    public int id { get; set; } 
    public string hotelName { get; set; } 

    [ForeignKey("HotelId")] 
    public ICollection<RoomType> RoomTypes { get; set; } 
} 

public class RoomType { 
    public int id { get; set; } 
    public string name { get; set; } 
    public int hotelId { get; set; } 
} 

Caller  
public JsonResult GetHotelByRoomTypes(string[] roomTypeNames) { 
    List<List<Hotel>> hotels = new List<List<Hotel>>(); 
    foreach (string roomTypeName in roomTypeNames) { 
    List<Hotel> partialHotel = hotelRepo.GetHotelsFromRoomType(roomTypeName); 
    hotels.Add(partialHotel); 
    } 
    return Json(hotels); 
} 

HotelRepo 
public List<Hotel> GetHotelsFromRoomType(string roomType) { 
    List<RoomType> roomTypes = db.RoomTypes.Where(r => r.name.Equals(roomType)).ToList(); 
    copy hotelId from roomTypes into int[] hotelIds 
    List<Hotel> hotels = db.Hotels.Where(h => hotelIds.Contains(h.id)).ToList(); 
    return hotels 
} 

Mon problème était si j'ai envoyé 2 roomTypes ["deluxe", "suite"]. Puis j'ai obtenu une liste de HotelA et HotelB comme premier résultat. Les deux contenaient une collection de roomType de "deluxe". Après cela, j'ai mis ces 2 hôtels dans la liste>.

Puis le deuxième résultat retourné HOTELA et HotelC qui HOTELA contenait la collection de Roomtype "suite". Lorsque cela s'est produit, HotelA du premier résultat serait le même que HotelA du second résultat qui ne contenait que "suite" dans la collection roomTypes et "deluxe" dans hotelA manquait.

Avez-vous des suggestions?

Répondre

0

Utilisez la méthode AddRange. Vous pouvez également nettoyer votre fonction de repo.

public JsonResult GetHotelByRoomTypes(string[] roomTypeNames) { 
    List<List<Hotel>> hotels = new List<List<Hotel>>(); 
    foreach (string roomTypeName in roomTypeNames) { 
    List<Hotel> partialHotel = hotelRepo.GetHotelsFromRoomType(roomTypeName); 
    hotels.AddRange(partialHotel); 
    } 
    return Json(hotels); 
} 
public List<Hotel> GetHotelsFromRoomType(string roomType) { 

    List<Hotel> hotelsWithRoomType = db.Hotels 
     .Include(h => h.RoomTypes) 
     .Where(h => h.RoomTypes.Any(r => r.name.Equals(roomType)) 
     .ToList(); 

    return hotels; 

} 

https://msdn.microsoft.com/en-us/library/z883w3dc%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

+0

Merci pour votre suggestion, mais cela n'a pas fonctionné pour moi. J'ai toujours eu le scénario où le premier résultat de GetHotelsFromRoomTypes retourné HotelA et HotelB qui contenait deluxe comme une collection roomType. Lorsque j'ai exécuté le GetHotelsFromRoomTypes pour la deuxième fois, j'ai obtenu HotelA et HotelC qui contenaient la suite en tant que collection roomType. Cependant, le premier HotelA qui contenait deluxe n'existait plus. Donc le retour a été [[HotelA: Suite, HotelB: Deluxe], [HotelA: Suite, HotelC: Suite]] Je m'attendais à [[HotelA: Deluxe, HotelB: Deluxe], [HotelA: Suite, HotelC: Suite] ] – user3456287