使用Where()导致EntityFramework中的System.ArgumentException

时间:2018-10-22 13:32:06

标签: c# entity-framework

我有一个简单的方法,可以从EntityFramework中的DbSet获取所有最近修改的对象:

public List<JobModel> GetJobs()
{
    return db.Jobs
        .Include(j => j.JobStatus)
        .Include(j => j.JobResolution)
        .Include(j => j.Process)
        .Where(j => (DateTime.Now - j.ModifiedDtm).Days < 2)
        .ToList();
}

这很好,没有查询的.Where(...)部分。但是,当我添加最后一点时,我得到以下三个例外:

  

抛出异常:EntityFramework.dll中的'System.ArgumentException'

     

抛出异常:EntityFramework.dll中的'System.ArgumentException'

     

抛出异常:EntityFramework.SqlServer.dll中的'System.ArgumentException'

db.Jobs中的所有行的有效值ModifiedDtmDateTime.Now之前。我究竟做错了什么?我尝试将Where()方法移到Include()上方,但是没有运气...

更新

由于@CamiloTerevinto,我得到了一条更为翔实的错误消息。我仍然不明白到底是什么意思...

  

DbArithmeticExpression参数必须具有数字通用类型。

2 个答案:

答案 0 :(得分:5)

我很确定您正在寻找DbFunctions.DiffDays函数:

return db.Jobs
    .Include(j => j.JobStatus)
    .Include(j => j.JobResolution)
    .Include(j => j.Process)
    .Where(j => DbFunctions.DiffDays(j.ModifiedDtm, DateTime.Now) < 2)
    .ToList();

答案 1 :(得分:0)

您不能在Entity Framework的DateTime.Now子句中使用Where。这是因为EF查询被转换为SQL查询,并且DateTime.Now在SQL中不存在。您应该尝试获取查询的前一天并将其作为长变量传递。