【问题标题】: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 它给出了空的结果

标签: c# entity-framework entity-framework-5


【解决方案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 实体框架扩展可以让您使用日期时间部分,但如果您将来更改数据库引擎,它们将无法工作。

【讨论】:

  • 谢谢,你救了我很多次
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2016-03-07
  • 2018-04-18
相关资源
最近更新 更多