在Entity Framework中比较日期的最佳方法

时间:2015-12-02 18:50:20

标签: c# entity-framework linq linq-to-entities

我在Entity Framework中的where子句中使用date并收到以下错误:

enter image description here

这是由于以下代码:

var entity = dbContext.MyTable
                      .Where(w => w.PId = 3 && w.CreatedOn.Date == mydate.Date)
                      .First();

如果我使用.ToList()将数据转换为列表,然后与日期进行比较,它将正常工作但如果我这样做,那么它将首先将数据拉入代码然后将其过滤掉。请帮我解决这个问题。目前我正在使用存储过程来解决问题,但我真的希望它能够正常工作。

4 个答案:

答案 0 :(得分:12)

您可以像这样使用DbFunctions.TruncateTime规范函数

var entity = dbContext.MyTable
    .Where(w => w.PId == 3 && DbFunctions.TruncateTime(w.CreatedOn) == mydate.Date)
    .First();

答案 1 :(得分:1)

EF目前不支持将LINQ中对象的所有粒度操作转换为SQL查询(这是在ToList()操作之前发生的事情)。有些东西(比如原始集合上的.Contains())。但不是所有的事情。

因此,虽然您可能希望查询转换为SQL语句中的各种“DATEPART”比较,但它不受支持。您必须更改LINQ才能适应它。

一种方法是评估24小时范围。这将在ToList()的任一侧工作:

DateTime minDate = new DateTime(mydate.Date.Year, mydate.Date.Month, mydate.Date.Second);
DateTime maxDate = minDate.AddSeconds(86399);

var entity = dbContext.MyTable
                      .Where(w => w.PId = 3 && w.CreatedOn >= minDate && w.CreatedOn <= maxDate).First();

答案 2 :(得分:1)

您无法使用.Date直接比较日期,因此您必须使用DbFunctionsEntityFunctions

我更喜欢使用DbFunctions

您可以按照以下说明使用它:

var entity = dbContext.MyTable
                  .Where(w => w.PId = 3 && DbFunctions.TruncateTime(w.CreatedOn) == DbFunctions.TruncateTime(mydate))
                  .First();

答案 3 :(得分:0)

这就是我结束日期搜索的结果,我不得不考虑时间(小时和分钟部分)

var entity = dbContext.MyTable
                      .Where(
                    x => x.CreatedOn.Year == mydate.Year
                    && x.CreatedOn.Month == mydate.Month
                    && x.CreatedOn.Day == mydatee.Day
                    && x.CreatedOn.Hour == mydate.Hour
                    && x.CreatedOn.Minute== mydate.Minute
                ).FirstOrDefault();