我目前正在开展一些工作,要求我检查两个日期之间的可用性。我目前的方法没有返回预期的结果。例如,假设我有以下保留意见:
我希望查看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 Query的一部分执行,而不是返回所有预留,然后在此列表上执行操作。
感谢。
答案 0 :(得分:8)
如果以下规则为真,则两个范围重叠:
(StartDate1 <= EndDate2) and (EndDate1 >= StartDate2)
通过将此规则应用于您的代码,您可以获得:
var reservation = _repository
.FindAllBy(x => x.StartDate <= checkout && x.EndDate >= checkin,
y => y.RoomTypeNav)
.ToList();