【问题标题】:How do I perform date-part comparison in EF如何在 EF 中执行日期部分比较
【发布时间】:2023-03-15 23:12:01
【问题描述】:

我听说人们说日期时间比较不起作用只是由于时间部分,因为日期时间有时间部分。

在 sql 中我总是这样比较日期时间,它工作正常

select * from employee
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format.

如何在 LINQ 查询中模拟这一点?

【问题讨论】:

  • 您是指实体框架 (=LINQ to Entities) 和 LINQ to SQL (pre EF ORM)?
  • FWIW,如果您使用的是 SQL Server 2008 或更高版本,您可能应该对时间部分不相关的字段使用Date(而不是DateTime)(实际上您不太可能有一个人出生的时间,更不可能对你有意义)。当Date 可用并且您不关心时间时使用DateTime 就像将所有数字数据存储在float 中,无论数据是否固有地是整数。

标签: c# entity-framework tsql linq-to-entities datetime-comparison


【解决方案1】:

如果您使用的是 .NET 4 或更高版本,只需使用 EntityFunctions.TruncateTime 辅助方法即可。这将为您将这种类型的日期时间到日期转换转换为 SQL。

from e in EfEmployeeContext
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01);

【讨论】:

  • 如果您使用的是LINQ to SQL,那么我会删除EntityFrameworklinq-to-entities 的标签,以及问题标题中对EF 的引用。使用 LINQ to SQL 意味着您的问题变得无关紧要。
  • 人们使用LINQ to SQL时不能进行日期比较?
  • 这不是我要说的,我是说你的问题是引用 EntityFramework 而不是 LINQ to SQL。这与询问“我如何在 C# 中执行 x”然后回答“谢谢,但是我将如何在 Java 中执行此操作?”相同。
  • EntityFunctions.TruncateTime(e.DOB) 已过时,请试试这个 System.Data.Entity.DbFunctions.TruncateTime(e.DOB)
【解决方案2】:

要记住的一件事是,对表示数据库列的 DateTime 结构的操作不会转换为 SQL。因此,您不能编写如下查询:

from e in EfEmployeeContext
where e.DOB.Date > new DateTime(2011,12,01);

...因为 e.DOB 代表数据库中的 DOB 列,EF 不知道如何翻译 Date 子属性。

但是,根据您想要的日期,有一个简单的解决方法:

  • 如果您想包括在 2011 年 12 月 1 日拥有出生日期的所有员工以及在该日期之后出生的员工,则只需查询:

    from e in EfEmployeeContext
    where e.DOB > new DateTime(2011,12,01);
    
  • 如果您只想包含 2011 年 12 月 1 日之后出生的员工,请查询:

    from e in EfEmployeeContext
    where e.DOB >= new DateTime(2011,12,02);
    

简而言之,可以根据需要设置标准,即您要与之比较的常量或文字 DateTime。您只是不能对表示 where 谓词中的 DB 列的属性进行彻底修改。这意味着您不能将一个 DateTime 列与另一个 DateTime 列的投影进行比较,例如:

    //get all employees that were hired in the first six months of the year
    from e in EfEmployeeContext
    where e.HireDate < new DateTime(e.HireDate.Year, 7, 1);

【讨论】:

  • 在 EfEmployeeContext 中从 e 执行此代码,其中 e.DOB > new DateTime(2011,12,01);适用于所有文化,因为美国的日期格式与英国不同。
  • DateTime 的构造函数总是先采用年,然后是月,然后是日,而不管可能用于将其显示为字符串的文化。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2019-03-26
  • 2019-06-09
相关资源
最近更新 更多