如何在 Linq 的 where 条件下从可为空的日期时间中删除时间部分

Posted

技术标签:

【中文标题】如何在 Linq 的 where 条件下从可为空的日期时间中删除时间部分【英文标题】:How can I remove the time part from a nullable datetime in where condition of Linq 【发布时间】:2021-09-17 03:40:47 【问题描述】:

我现有的 Linq 语句无法在 where 条件中应用可为空的日期时间模型值。当我使用 shortdatestring() 应用日期时间时,会显示以下错误:

.Where(ti => ti.Outer.EmpCode == __empcode_0 && ti.Outer.ClockDateFormatted == __ToShortDateString_1)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估

这是代码

考勤模式

public string Code  get; set; 
public DateTime? ClockedDate  get; set; 

public ICollection<Attendance> GetClockList(string code, DateTime datefrom)

    ICollection<Attendance> data = new List<Attendance>();
    data = (from log in ctx.Attendance
            join emp in ctx.Employee on log.EmpCode equals emp.EmployeeID.ToString()
            where log.EmpCode == empcode
            && log.ClockedDate.Value.ToShortDateString() == datefrom.ToShortDateString() // Here I have to give the ClockedDate without time 
            select new Attendance 
            
              
                EmployeeName = emp.EmployeeName,
                ClockedDate = log.ClockedDate,

            
            ).ToList();

    return data;

但在 where 条件下使用shortdateString() 给出日期时间时会显示错误

【问题讨论】:

您是否尝试过使用DateTime.Date property?例如:log.ClockedDate.Value.Date == datefrom.Date? 在比较之前不要转换数据库列,它会影响性能。 Use a date interval. 【参考方案1】:

如果你使用 ms sql 你可以试试这个

.....

  where log.EmpCode == empcode
         && EF.Functions.DateDiffDay(log.ClockedDate, datefrom)==0

【讨论】:

【参考方案2】:

你可以试试

 && log.ClockedDate?.Date == datefrom.Date

但如果这不起作用,您可能需要EF Functions。

【讨论】:

以上是关于如何在 Linq 的 where 条件下从可为空的日期时间中删除时间部分的主要内容,如果未能解决你的问题,请参考以下文章

具有可为空对象属性的 Linq“where”条件导致“调用非静态方法需要一个目标”

总和可为空的 Linq 查询

SQL 在 Where 子句中处理可为空的外键

为啥条件运算符不能正确地允许使用“null”来分配给可为空的类型? [复制]

解构可为空的对象

如何从数据库中获取可为空的 DateTime