EF如何按日期过滤数据

时间:2012-08-16 08:56:16

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

我使用的是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 });

3 个答案:

答案 0 :(得分:5)

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,详细说明一下:

实体框架无法在数据库端转换DateTime对象上的Date属性。

您的选择是:

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

(2)或者如果不可能,您可以使用EntityFunctions类,该类公开可以翻译的方法(例如TruncateTime)通过EF进入底层数据源的相应本机函数。

e.g。

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

答案 1 :(得分:3)

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 });

答案 2 :(得分:0)

在EF 6中:

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