【问题标题】:How to search between two dates in LINQ to Entity?如何在 LINQ to Entity 中的两个日期之间进行搜索?
【发布时间】:2011-02-13 22:23:01
【问题描述】:

我在 SQL 中有一个示例,如何在 Linq to Entity 中使用相同的逻辑?

SELECT * FROM TABLE WHERE DATE BETWEEN STARTDATE AND ENDDATE 

【问题讨论】:

    标签: .net linq linq-to-entities


    【解决方案1】:

    我假设是 C#。

    DateTime startDate=bla;
    DateTime endDate=blabla;
    using(var db=new MyDataContext())
    {
        var filteredData=db.TABLE.Where(t => t.DATE > startDate && t.DATE < endDate);
        //...
    }
    

    【讨论】:

    • 使用&gt;=&lt;= 得到与BETWEEN 相同的结果。
    • 出于这个原因,我从不使用 BETWEEN。我更喜欢另一种形式的明确性。
    • 对我来说这不起作用导致 LINQ to Entity 错误。我也在使用 DBContext
    • @CraigStuntz 甚至添加= 跳过endDate 的所有记录。你能猜到吗..?为什么会发生这种情况..?
    • @shashwat 要实际获取两个日期之间的值,我认为您实际上会想要t.DATE &gt;= startDate &amp;&amp; t.DATE &lt; endDate,其中endDate 已经添加了额外的一天。否则你不会得到最后一个日期的任何东西(因为一个日期实际上是当天上午 12 点,所以小于或等于上午 12 点的某个日期实际上在它期间没有任何东西,只有在它之前。)
    【解决方案2】:

    您会希望它在开始日期包含在内,但在结束日期不包含。这是因为用作日期的 DateTime 确实是当天的开始,并且不会延伸到一天的结束。

    // dates that are inclusive on the date range
    var startDate = new DateTime(2016, 1, 1);
    var endDate = new DateTime(2016, 12, 31);
    
    ...
    
    // WRONG: this will ignore data on the last day
    .Where(obj => obj.StartDate >= startDate && obj.EndDate <= endDate)
    
    // RIGHT: this will include the last day
    var endDateExclusive = endDate.AddDays(1);
    
    ...
    
    .Where(obj => obj.StartDate >= startDate && obj.EndDate < endDateExclusive)
    

    即使您使用特定的DateTime 值,使用&gt;=&lt; 仍然很重要,而不是&gt;=&lt;=&gt;&lt;

    如果您同时使用 &gt;=&lt;= 符号,则从 X 到 Y 和从 Y 到 Z 的两个日期范围都将包含与 Y 完全匹配的记录。根据您的要求,包含它可能是一个严重的缺陷两个日期范围内的记录。同样,如果您使用 &gt;&lt;,您将改为排除两个日期范围内与 Y 完全匹配的记录。

    【讨论】:

    • 增加一整天可能会导致一些意想不到的问题,对我来说这听起来像是代码味道。事实上,当您在日期之间进行搜索时,大多数情况下您会希望从开始日期的第一秒到结束日期的最后一秒进行搜索。示例:从“2020-12-20 00:00:00.000”到“2020-12-20 23:59:59.999”搜索一整天。
    • @leoap 您可以通过构造“2020-12-20 23:59:59.999”结束日期 DateTime 值来做到这一点,是的,但是搜索 startDate >= 2020-12-20 && endDate < 2020-12-21,它找到了一天的数据。请注意 endDate 是排他性的,而不是包含性的。
    • 我明白你在说什么,但我评论的重点是在日期上添加一整天的操作,而不是比较方法本身。如果某个日期恰好是“2020-12-20 03:45:57”,那么添加一整天将导致它是“2020-12-21 03:45:57”,并且可能会导致意外行为。
    • @leoap 好的,但您所说的基本上是,如果开始时间戳具有意外的时间值,那么结束时间戳也会如此。当然,如果你用错误的数据计算,你最终会得到错误的数据。关键是结束日期的“日期”日期时间值。为“2020-12-21 0:00:00”创建日期时间不会使您的示例更加正确。在我的示例中,我创建了一个新的 DateTime,然后向其中添加了 1 天,这不会有任何意外的时间值。 (在我自己的代码中,我实际上使用了自定义 Date 结构。)
    • 如果你总是创建日期对象,好的。但如果日期来自其他来源,那么仅添加一整天是危险的。这就是我要说的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多