【问题标题】:Find available rooms between dates LINQ查找日期之间的可用房间 LINQ
【发布时间】:2017-05-10 16:08:31
【问题描述】:

我正在尝试创建一个系统,用户将输入他们希望拥有的到达日期和离开日期以及房间类型,然后程序将检查是否有任何该类型的房间可用,如果有,它将返回房间号。

这是我用来从视图中检索信息的视图模型

    public class AvailabilityDTO
{
    [Key]
    public string Id { get; set; }

    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    public DateTime Arrival { get; set; }

    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
    public DateTime Departure { get; set; }

    [Required]
    public string RoomType { get; set; }
}

这是我的数据库表

问题是我不确定如何使用 LINQ 表达式来获取具有与所述相同 RoomTypes 但在所选日期内不属于任何预订的房间的房间号。

我得到的最接近的方法是使用我在创建 Reservation 时使用的相同 LINQ 表达式来检查它是否在管理 CRUD 中的这些日期被占用。 该表达式是:

        private bool OccupiedRoom(Reservation CurrentReservation)
    {
        var currentBooking = db.Reservations
            .Where(b => b.RoomId == CurrentReservation.RoomId)
            .Select(b => (b.Arrival <= CurrentReservation.Arrival && b.Depature >= CurrentReservation.Arrival) ||
                         (b.Arrival < CurrentReservation.Depature && b.Depature >= CurrentReservation.Depature) ||
                         (CurrentReservation.Arrival <= b.Arrival && CurrentReservation.Depature >= b.Arrival)

            )
            .FirstOrDefault();

        return currentBooking;
    }

然而,试图修改它以适应我的情况让我非常难过,任何帮助都是值得的。

【问题讨论】:

  • 不要在您的问题中放置代码图像。复制并粘贴它,这样我们就可以实际使用它,而无需重新输入大量的 LINQ 语句。
  • @MrZander 那是我编辑的对不起。
  • 伪代码:var bookableRooms = AllRooms.Except(Rooms_with_conflicting_reservations) 当然,如果你有房间的导航属性预订也会更容易。

标签: c# sql asp.net-mvc linq querying


【解决方案1】:

首先,您应该始终从您所追求的实体开始,即db.Rooms 而不是db.Reservations。然后,如果您在Room 上还没有Reservations 导航属性,您应该添加一个,因为它大大简化了查询。这样,确保与房间相关的所有预订要么在请求到达日期之前结束,要么在请求的离开日期之后开始,这变得很简单。因此:

var availableRooms = db.Rooms.Where(m => m.Reservations.All(r => r.Departure <= model.Arrival || r.Arrival >= model.Departure)

我在这里使用了&lt;=&gt;=,因为在正常情况下,您会在上午 11 点退房,然后在下午 3 点入住。因此,同一房间实际上可以由两个人在同一天预订,只要一个人正在退房,另一个人正在入住。如果这不是您的情况,请相应地调整查询。

【讨论】:

  • 这样就成功了。刚刚添加了一个额外的检查房间类型的地方,它返回了我需要的东西。谢谢!
【解决方案2】:

如果您使用查询表达式语法,这可能会提供一些想法:

var query = from room in database.Rooms
join res in database.Reservations 
on room.roomId equals res.roomId
where room.Type==CurrentReservation.RoomType
&& res.departdate<=CurrentReservation.Dep && res.arrivalDate>=arrDate
select new { Id = res.RoomId };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多