【问题标题】:C# Linq to Entities get records where date range contains dates in the current monthC# Linq to Entities 获取日期范围包含当月日期的记录
【发布时间】:2014-07-03 07:46:51
【问题描述】:

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

【问题讨论】:

  • 什么是currentDate
  • currentDate 是今天。
  • 您的第二个示例可以正常工作,但我假设您可能也想检查Year
  • 我尝试了我的第二个示例,但是当我有例如 StartDate="2014-06-23" 和 EndDate="2014-08-01" 时它不起作用,因为当月没有一个日期 = = currentDate.Month.
  • 你的第一个例子应该可以工作......

标签: c# linq entity-framework-4 linq-to-entities


【解决方案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();

【讨论】:

    【解决方案2】:

    两个测试都不够:如果当前日期是今天,那么第一个测试将错过任何不包括当前日期的日期范围,因此如果今天是本月的第一天,任何从第二个开始的日期范围虽然有效不会被抓到。此外,单日范围 - 除非您包含时间,否则不会被捕获,因为开始和结束日期可能等于当前日期,但不能大于和小于 - 取决于您指定日期范围的方式。

    第二次测试失败首先是因为每年都有 1-12 个月,所以你不仅会选择今年的记录,还会选择所有年份的记录,其次你会错过任何在当月之外开始和结束的时期。

    创建要比较的天数列表听起来并不高效 最少运行次数 28 最多 31 次。

    因此,您需要根据 Daniels 代码测试从当月开始或在当月结束的范围,但此外,您还需要测试开始日期在当月之前和结束日期在本月我认为应该涵盖所有情况?

    【讨论】:

      【解决方案3】:

      我认为可以,请尝试一下:

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

      【讨论】:

      • LINQ to Entities 无法识别方法 'System.Collections.Generic.IEnumerable`1[System.Int32] Range(Int32, Int32)' 方法,并且此方法无法转换为存储表达式.
      • @VAAA 在假期后放置 .ToList()。
      • 我认为如果我放置 .ToList() 我会在那时将查询发送到数据库。所以我会把所有的记录都带上。
      • @VAAA 是的,它会的,所以改为放置 .AsEnumerable()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多