我目前正在处理一个需要检查两个日期之间可用性的项目。我的当前方法未返回预期结果。例如,假设我有以下预订:
- 2015年4月13日至2015年4月18日
- 2015年4月15日至2015年4月20日
- 2015年4月10日至2015年4月16日
我希望查看所有在2015年4月15日至2015年4月16日期间的预订。从视觉上看,可能如下所示:
15 16
X________|_____|______X
|X____|_____________X
X______________|____X|
| |
为了获取在这些日期之间的所有预订,我正在使用以下方法:
public List<ReservationClientModel> GetReservationsByDateRange(int id, DateTime checkin, DateTime checkout)
{
var reservation = _repository.FindAllBy(x =>
(x.StartDate >= checkin && x.EndDate <= checkout) ||
(x.StartDate >= checkin && x.StartDate <= checkout) ||
(x.EndDate >= checkin && x.EndDate <= checkout)),
y => y.RoomTypeNav)
.ToList();
return Mapper.Map<List<ReservationClientModel>>(reservation);
}
这是使用哪个:
public IEnumerable<TEntity> FindAllBy(Expression<Func<TEntity, bool>> predicate, params Expression<Func<TEntity, object>>[] includes)
{
var set = _dbSet.AsQueryable();
set = includes.Aggregate(set, (current, include) => current.Include(include));
return set.Where(predicate);
}
这将仅返回最后两个预订,我认为这是因为它在日期上检查了
>
和<
,而不是检查它是否在范围内。我知道可以使用SQL BETWEEN
运算符,但我想知道是否有任何方法可以使用Linq表达式或从C#中执行此操作?理想情况下,我希望将其作为EF查询的一部分执行,而不是返回所有预订,然后对此列表执行操作。感谢您的帮助。