我有假期 EF实体:
public class Holiday {
public int HolidayId {
get;
set;
}
public DateTime StartDate {
get;
set;
}
public DateTime EndDate {
get;
set;
}
public bool IsActive {
get;
set;
}
}
我需要获取当月内至少有一天的所有记录。
例如:
StartDate = "2014-06-29"
EndDate = "2014-07-03"
如果当前月份是7月,那么我应该获得该记录,因为在此之后我将不得不创建影响当月的所有日期的List<int>
。因此,在最后一个示例中,我将不得不创建一个List<int>
:
7月1,2和3日。
例如:
StartDate = "2014-07-23"
EndDate = "2014-08-01"
我也应该记录下来。
我在做:
var holidays = Holidays.Where(h=> h.IsActive == true && h.StartDate < currentDate && h.EndDate > currentDate).ToList();
但是,查询没有做我需要的。
有任何线索吗?
这个怎么样:
.Where(h => h.IsActive == true && (h.StartDate.Month == currentDate.Month || h.EndDate.Month == currentDate.Month)).ToList();
更新:
当我的月份不等于currentDate.Month时,这不起作用。像:
StartDate = "2014-06-29"
EndDate = "2014-08-03"
答案 0 :(得分:1)
有效的解决方案是:
也许不是最干净的。
var holidays = Uow.HolidayRepository.GetAllReadOnly().Where(h => h.IsActive == true && (h.StartDate.Month == currentDate.Month || h.EndDate.Month == currentDate.Month) || (currentDate.Month > h.StartDate.Month && currentDate.Month < h.EndDate.Month)).ToList();
答案 1 :(得分:0)
这两项测试都不充分:如果当前日期是今天,那么第一次测试将会错过任何不包含当前日期的日期范围,因此如果今天是本月的第一个,则任何日期范围从第二个开始虽然有效但不会被抓住。此外,单日范围 - 除非您包括因为开始日期和结束日期可能等于当前日期而被捕获的次数,但绝不能大于和小于 - 取决于您指定日期范围的方式。< / p>
第二次测试首先失败,因为每年都有1到12个月,因此您不仅会选择今年的记录,而且会记录所有年份,其次是您错过任何在月外开始和结束的时段。
创建要比较的天数列表并不是最有效的最小运行次数28 max 31.
因此,您需要根据Daniels代码测试当前月份开始或当月结束的范围,但此外您还需要测试开始日期在当前月份之前的位置以及结束日期是否在本月我认为应该涵盖所有案例?
答案 2 :(得分:0)
我认为这样做,请试一试:
int month = DateTime.Now.Month;
var result = Holidays.AsEnumerable().Where(h => Enumerable.Range(h.StartDate.Month, (h.EndDate.Month - h.StartDate.Month) + 1).Contains(month));