比较实体框架中的日期时间

Posted

技术标签:

【中文标题】比较实体框架中的日期时间【英文标题】:Compare DateTimes in Entity Framework 【发布时间】:2017-10-23 17:03:19 【问题描述】:

我正在尝试这样做,但它不起作用,它返回空结果:

if (inputDate != null)

     dataContext.myTable
                .Where(r => r.myDate.HasValue && 
                            r.myDate.Value.Day == inputDate.Value.Day)

我想比较两个可以为空的DateTime 值,我只想从属于某个Date 的数据库中检索DateTime 值。为了简化这个问题,我首先尝试只比较它们的Day 值。

请不要标记为重复,我正在使用 EF5,所以我没有DbFunctions.TruncateTime() 功能。

【问题讨论】:

你可以使用r.myDate.Date == inputValue.Date。使用Day 意味着无论月份如何,您都会得到匹配。 不工作它会给出一个例外:LINQ to Entities 不支持指定的成员“日期”。事实上 EntityFramework 并没有重新考虑如何将这段代码翻译成 sql 尝试删除r.myDate.HasValue,然后使用r.myDate.Date == inputValue.Date @S.Petrosov 仅当 myDate 列是 DATE 列时才有效。如果是DATETIME,则不会。 我试图删除 HasValue 但仍然无法正常工作。对于 .Date,它给出了一个异常LINQ to Entities 中不支持指定的成员“日期”。。而对于 .Day 它给出了空的结果 【参考方案1】:

如你所说,Entity Framework 会抛出错误。您拥有的最佳选择是使用条件介于一天的第一秒和一天的最后一秒之间的查询。

if(inputDate != null)

    /* Assuming inputDate.Value only contains the Date part.
       i.e. : 2017-05-23 instead of 2017-05-23 10:00:32 */
    DateTime inputDateFirstSecond = inputDate.Value;
    DateTime inputDateLastSecond = inputDateFirstSecond
        .AddHours(23)
        .AddMinutes(59)
        .AddSeconds(59);

    dataContext.myTable.Where(r => r.myDate.HasValue &&
        (r.myDate.Value >= inputDateFirstSecond && r.myDate.Value <= inputDateLastSecond)
    )
    

有一些 SQL Server 实体框架扩展可以让您使用日期时间部分,但如果您将来更改数据库引擎,它们将无法工作。

【讨论】:

谢谢,你救了我很多次

以上是关于比较实体框架中的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

实体框架中的日期时间文化问题

强制实体框架使用 datetime 而非 datetime2

比较 JPA Criteria API 中的日期实体

实体框架 - SQL Server 2005 - IIS 服务器日期时间问题

如何在条件下使用实体框架组日期而不是时间日期和总和

在实体框架代码中,日期时间总是更改为时间戳