【发布时间】:2016-04-23 06:53:13
【问题描述】:
我有一个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 将查询与 AND 条件连接,而不是 OR 条件,我认为这是一个非常糟糕的方法。
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# 代码查找在所需天数内可用的房间。
-
Activity.Active对房间/日期批次意味着什么? -
如果它是从系统中删除的东西,它的活动将被标记为 Active = false。我将从查询中删除它以避免混淆。
标签: c# sql-server entity-framework linq-to-sql lambda