我有一个Apartments
的列表,其中每个Apartment
有它的ApartmentRooms
,其中每个ApartmentRoom
都有它的DateBatches
。每个DateBatch
都有Dates
的列表,表示占用日期(每个拍摄日期一个记录)。实体框架日期组合查询
Apartment 1
Room 1
DateBatch
1.5.2015
2.5.2015
DateBatch 2
8.5.2015
9.5.2015
Room 2
DateBatch
5.5.2015
6.5.2015
通过这种方式,你可以看到,这间公寓有2间房间,其中1间是采取下列日期1.5,2.5,8.5,9.5和2室被占用的5.5和6.5。
用户可以输入想要停留的N天和X连续天数的期望时间段。
因此,例如,用户输入1.5到15.5的时间段,他想要睡10个晚上,我需要列出至少有一个公寓房间可用于任何可能的日期组合的所有公寓,这将是下面在这种情况下:
1.5-10.5
2.5-11.5
3.5-12.5
4.5-13.5
5.5-14.5
到目前为止,我已经尝试了这一点,它仅适用于第一次的foreach迭代,因为和标准,没有或标准,我的foreach会连接查询觉得这是一个非常不好的做法走。
public static IQueryable<Apartment> QueryByPeriod(this IQueryable<Apartment> apartments, DateTime PeriodStart, DateTime PeriodEnd, int StayDuration)
{
var possibleDateRanges = new List<List<DateTime>>();
//set all possible start dates for the desired period
for (var i = PeriodStart; i <= PeriodEnd.AddDays(-StayDuration); i = i.AddDays(1))
{
List<DateTime> dates = new List<DateTime>();
foreach(var date in i.DateRange(i.AddDays(StayDuration-1)))
{
dates.Add(date);
}
possibleDateRanges.Add(dates);
}
//filter by date range
//select apartment rooms where one of possible combinations is suitable for selected period
foreach (var possibleDates in possibleDateRanges)
{
apartments = apartments.Where(m => m.ApartmentRooms
.Any(g => g.OccupiedDatesBatches.Select(ob => ob.OccupiedDates).Any(od => od.Any(f => possibleDates.Contains(f.Date)))
) == false);
}
return apartments;
}
有什么建议吗?
我不会尝试用SQL语句来做任何事情到数据库。我会做一些与SQL的代码,其余的与C#。我首先会查询数据库中的开始日期和结束日期之间占用的房间,这将是用户想要房间的最早和最晚日期。然后使用C#代码来查找哪些房间可用于需要的时间段。 – jdweng
对于房间/日期批次,“Activity.Active”意味着什么? –
如果它从系统中删除,它的活动将被标记为活动= false。 我会从查询中删除它以避免混淆。 – Robert