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

Man*_*ngh 6 c# linq linq-to-entities entity-framework

我在实体框架中的where子句中使用date并获得以下错误:

在此输入图像描述

这是由于以下代码:

var entity = dbContext.MyTable
                      .Where(w => w.PId = 3 && w.CreatedOn.Date == mydate.Date)
                      .First();
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*oev 13

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

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


ssi*_*777 7

当我不得不考虑时间(小时和分钟部分)时,这就是我最终进行日期搜索的方式

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();
Run Code Online (Sandbox Code Playgroud)


小智 5

您不能通过使用直接比较日期.Date,为此您必须使用DbFunctions或EntityFunctions。

我更喜欢使用 DbFunctions

您可以按如下方式使用它:

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

  • 仅供参考:“EntityFunctions”类已过时,已被“System.Data.Entity.DbFunctions”取代。 (2认同)