如何在EF查询中执行日期比较?

49 c# linq datetime linq-to-entities datetime-comparison

请帮忙.我试图弄清楚如何在linq查询中使用DATE或DATETIME进行比较.

示例:如果我想要在今天之前启动的所有员工姓名,我会在SQL中执行以下操作:

SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today
Run Code Online (Sandbox Code Playgroud)

但是linq怎么样?

DateTime startDT = //Today

var EmployeeName =  
from e in db.employee
where e.StartDateColumn <= startDT 
Run Code Online (Sandbox Code Playgroud)

上面的WHERE不起作用:

异常详细信息:System.NotSupportedException:LINQ to Entities中不支持指定的类型成员"Date".仅支持初始值设定项,实体成员和实体导航属性.

Man*_*jua 78

使用该类DbFunctions修剪时间部分.

using System.Data.Entity;

var bla = (from log in context.Contacts
           where DbFunctions.TruncateTime(log.ModifiedDate) 
                              ==  DbFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

来源:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

  • 这应该是答案 (6认同)
  • EntityFunctions已被废弃,由DbFunctions取代,更新后的答案反映了这一点 (3认同)
  • 如何看待sql查询是什么DbFunctions.TruncateTime生成:((convert(datetime2,convert(varchar(255),[Extent1].[InspectionReportInfo_Date],102),102))='2015-02-10T00:00:00 '这会杀死任何索引,我会避免它... https://social.msdn.microsoft.com/Forums/en-US/45f496e1-550d-4638-9673-127e406e2352/entityfunctions-truncatetime-inefficiency?forum=adodotnetentityframework&prof为必填 (3认同)
  • EntityFunctions 在 EF 6.0 中被替换。因此,如果您仍在使用 4.5 或更早版本(像我一样),您仍然应该使用 EntityFunctions。 (2认同)

jas*_*son 20

这应该工作.您确定查询的其他部分没有触发异常吗?我有几个表单查询实例

var query = from e in db.MyTable
            where e.AsOfDate <= DateTime.Now.Date
            select e;
Run Code Online (Sandbox Code Playgroud)

在我的代码中.

  • 这不是问题 - e.AsofDate.Date是问题(只比较日期部分 - 双方...... (6认同)

Shi*_*iji 10

这可能是由于数据库中的日期可以为空.试试这个:

var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT 
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以检查这样的情况

var nextDay = DateTime.Today.AddDays(1);

var query = from e in db.MyTable
            where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
            select e;
Run Code Online (Sandbox Code Playgroud)

在今天(00:00:00)和tommorow(00:00:00)之间检查时,您将获得AsOfDate日期的记录,我们将获得今天的日期记录...


小智 5

你不能使用.Date

如果您想今天查看,可以立即创建日期时间

DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var e = (from mds in myEntities.Table
         where mds.CreateDateTime >= myDate
         select mds).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)