【问题标题】:MVC EF first result query is replaced by second result if second result got the same record如果第二个结果获得相同的记录,则 MVC EF 第一个结果查询将被第二个结果替换
【发布时间】:2016-01-16 17:44:46
【问题描述】:

我使用了实体框架 5。 我有一家桌子酒店,里面有很多房间类型。

当我想通过循环每个房间类型的函数并合并结果来查找哪个酒店具有以下房间类型时。如果第一个结果包含相同的记录,则将其替换为第二个结果。

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 
}

我的问题是如果我发送了 2 个房间类型 [“豪华”、“套房”]。然后我得到了 HotelAHotelB 的列表作为第一个结果。它们都包含“豪华”房间类型的集合。之后,我将这 2 家酒店放入 List>。

然后第二个结果返回HotelAHotelC,其中HotelA包含房间类型“套房”的集合。

发生这种情况时,第一个结果的 HotelA 将与第二个结果的 HotelA 相同,后者在 roomTypes 集合中仅包含“suite”,而 hotelA 中的“deluxe”缺失。

你有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc entity-framework entity-framework-5


    【解决方案1】:

    使用 AddRange 方法。你也可以清理你的 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

    【讨论】:

    • 感谢您的建议,但它对我不起作用。我仍然遇到 GetHotelsFromRoomTypes 的第一个结果返回 HotelA 和 HotelB 的场景,其中包含 deluxe 作为 roomType 集合。当我第二次执行 GetHotelsFromRoomTypes 时,我得到了 HotelA 和 HotelC,其中包含作为 roomType 集合的套房。然而,第一家包含豪华的HotelA已不复存在。所以返回的是 [[HotelA:Suite, HotelB:Deluxe], [HotelA:Suite, HotelC:Suite]] 我期望 [[HotelA:Deluxe, HotelB:Deluxe], [HotelA:Suite, HotelC:Suite]]跨度>
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多