【问题标题】:Compare 2 dates within a Linq query比较 Linq 查询中的 2 个日期
【发布时间】:2015-03-29 16:04:00
【问题描述】:

我正在尝试在 LINQ 查询中比较 2 个 DateTime 值的 2 个日期(仅日期):

var appointmentsWithPatch = (from ap in context.DBAppointment where dtStart.Date ==  ap.StartDate.Value.Date select ap).ToList();

知道 dtStart 包含 27/03/2015 并且我的 DBAppointment 表中有一条记录,其日期为 StartDate,它应该返回一个元素。但是,它不起作用,我得到空值。

知道这里发生了什么吗?

【问题讨论】:

  • 你所说的“我得到空值”到底是什么意思?你看过生成的 SQL 吗? (附带说明,在这里使用查询表达式没有任何好处,值得使用垂直空格来避免水平滚动......)

标签: c# linq datetime


【解决方案1】:

尝试从dtStart.Date截断时间:

 var appointmentsWithPatch = 
          (from ap in context.DBAppointment 
             where EntityFunctions.TruncateTime(dtStart.Date) == ap.StartDate.Value.Date 
             select ap)
         .ToList();

如果您使用的是 EF6,请将 EntityFunctions 更改为 DbFunctions

其他信息:

EntityFunctions 方法称为规范函数。这些是一组功能,所有实体框架提供者都支持这些功能。这些规范函数将被转换为提供者的相应数据源功能。规范函数是访问核心语言之外的功能的首选方式,因为它们保持查询的可移植性。

您可以找到所有规范函数 here 以及所有日期和时间规范函数 here

别忘了添加对System.Data.ObjectsSystem.Data.Entity的引用。

【讨论】:

    【解决方案2】:

    您需要使用 Linq to Entities。

    var appointmentsWithPatch = (from ap in context.DBAppointment where DbFunctions.DiffDays(dtStart, ap.StartDate) == 0 select ap).ToList();
    

    法哈德的回答同样有效;关键是 Entity Framework 需要将你的 Linq Expression 转换为相应的 SQL,而 DbFunctions 提供了使其能够做到这一点的工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2013-09-16
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多