【问题标题】:EF how to filter data by dateEF如何按日期过滤数据
【发布时间】:2025-12-01 12:55:01
【问题描述】:

我使用 EF 4,我的实体中有一个属性 DateTimeStart,日期格式为 16/08/2012 08:14:40,我想使用 EF 查询并找到所有实体 within the date 16/08/2012 only。使用下面的代码我收到此错误

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

我的代码

 DateTime dateTimeNow = DateTime.UtcNow;
        DateTime dateNow = dateTimeNow.Date;
        return db.EventCustoms.Where(x => x.DataTimeStart.Date <= dateNow)
            .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart });

【问题讨论】:

  • DataTimeStart 是什么数据类型?

标签: linq entity-framework entity-framework-4


【解决方案1】:
DateTime dateTimeNow = DateTime.UtcNow;
DateTime dateTomorrow = dateTimeNow.Date.AddDays(1);
return db.EventCustoms.Where(x => x.DataTimeStart < dateTomorrow) 
            .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 

[编辑] @GibboK,详细说明一下:

Entity Framework 无法在数据库端转换 DateTime 对象上的 Date 属性。

您的选择是:

(1)(如上)重新考虑您的查询并尝试一种不需要在数据库端为表中的每一行调用函数的解决方案......这对查询性能也有好处

(2) 或者如果这不可行,您可以使用 EntityFunctions 类,它公开了 可以 由 EF 转换为适合底层数据源的原生函数。

例如

return db.EventCustoms
    .Where(x => EntityFunctions.TruncateTime(x.DataTimeStart) <= dateNow)

【讨论】:

  • 今天在实现这个答案时,我发现System.Data.Entity.Core.Objects.EntityFunctions 已被弃用,应该由System.Data.Entity.DbFunctions 替换。新的命名空间/类中存在相同的 TruncateTime() 方法,因此只需将 EntityFunctions 更改为 DbFunctions 并添加正确的 using 语句,对于此答案的未来用户应该会很好。
  • 但请注意,这将在什么 SQL 语句中进行翻译。它类似于((convert (datetime2, convert(varchar(255), [Filter1].[DateTimeStart], 102), 102)) &lt;= '2017-01-13 00:00:00'- 所以我想我会使用dateTomorrow 版本,因为这不需要在行级别的数据库中进行任何转换。
【解决方案2】:
DateTime dateTimeNow = DateTime.UtcNow;
        DateTime dateNow = dateTimeNow.Date;
        return db.EventCustoms.Where(
             x => EntityFunctions.DiffDays(x.DataTimeStart, dateNow) >= 0)
            .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart });

【讨论】:

  • 嗨,Amiram Korach,很遗憾无法正常工作,您能看看并告诉我吗?非常感谢您的宝贵时间
  • 对不起我的错误。它应该是“>=”。如果第一个值小于第二个值,此方法将为您提供正数。
【解决方案3】:

在 EF 6 中:

using System.Data.Entity;
...
db.EventCustoms.Where(x => 
 DbFunctions.TruncateTime(x.DataTimeStart) <= DbFunctions.TruncateTime(dateNow))

【讨论】: