EF如何按日期过滤数据

问题描述 投票:0回答: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 });
linq entity-framework entity-framework-4
4个回答
7
投票
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 类,该类公开了 can 可以由 EF 转换为底层数据的适当本机函数的方法(例如 TruncateTime)来源。

例如

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

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

1
投票

在 EF 6 中:

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

0
投票

这不是一个正确的解决方案,但它会帮助你

DateTime startOfDay = new DateTime(invoiceDate.Value.Year, invoiceDate.Value.Month, invoiceDate.Value.Day, 0, 0, 0);
DateTime endOfDay = new DateTime(invoiceDate.Value.Year, invoiceDate.Value.Month, invoiceDate.Value.Day, 23, 59, 59, 999);
predicate.And(x => x.InvoiceDate >= startOfDay && x.InvoiceDate<= endOfDay);
© www.soinside.com 2019 - 2024. All rights reserved.