我正在尝试建立一个系统,用户将输入到达日期和出发日期以及他们希望拥有的房间类型,然后程序将检查是否有任何类型的房间可用,如果是,它将返回房间号码。
这是我用来从View
中检索信息的视图模型 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表达式获取房间的房间号码,房间类型与所述房间类型相同,但在选定日期内不属于任何预订。
我最接近的是使用我在创建预约时使用的相同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;
}
然而,试图修改它以适应我的情况让我绝对难过,任何帮助都是适当的。
答案 0 :(得分:4)
首先,您应该始终使用您之后的实体,即db.Rooms
而不是db.Reservations
。然后,如果您在Reservations
上没有Room
导航属性,则应添加一个,因为它极大地简化了查询。由此,确保与房间相关的所有预订在请求到达日期之前结束或在请求的出发日期之后开始变得简单。因此:
var availableRooms = db.Rooms.Where(m => m.Reservations.All(r => r.Departure <= model.Arrival || r.Arrival >= model.Departure)
我在这里使用<=
和>=
,因为在正常情况下,您可以查看上午11点的时间,然后是下午3点的入住时间。因此,同一天,同一个房间实际上可以由两个人预订,只要一个人正在退房而另一个人正在办理登机手续。如果不是您的情况,请相应地调整查询。
答案 1 :(得分:1)
如果您使用查询表达式语法,这可能会有一些想法:
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 };