c# Linq to Entities获取日期范围包含当前月份日期的记录

本文关键字:日期 记录 包含当 范围 to Linq Entities 获取 取日期 | 更新日期: 2023-09-27 18:11:16

我有假期 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"

我也应该得到那个记录。

I was doing:

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"

c# Linq to Entities获取日期范围包含当前月份日期的记录

有效的解决方案是:

也许不是最干净的。

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- 12个月,所以你不仅会选择今年的记录,而且会选择所有年份的记录,其次你会错过开始和结束于该月以外的任何时期。

创建一个天数列表来比较听起来不太有效最小运行数28最大31。

所以你需要测试的范围要么开始于当前月份,要么结束于当前月份,按照丹尼尔斯的代码,但除此之外,你还需要测试开始日期在当前月份之前,结束日期在当前月份之后,我认为这应该涵盖所有情况?

我想这个可以,请尝试一下:

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));