比较 LINQ 中的日期 Entity Framework
Comparing dates in LINQ Entity Framework
我正在尝试 运行 以下查询:
List<EPCRA_Events> x =
_dbContext.EPCRA_Events
.Where(e => e.DueDt.HasValue &&
(e.DueDt.Value - DateTime.Now).Days < 30)
.ToList();
但我一直收到错误消息
The LINQ expression ...xxx... could not be translated
在查看其他帖子后,我发现一个常见的解决方案是使用 DbFunctions
class。但是,在使用 Nuget 导入 Entity Framework 6.4.4 和 Microsoft.EntityFrameworkCore
5.0.9 后,我无法访问 class。此外,Entity
class 不在 System.Data
命名空间中。
如能提供有关如何将此查询发送至 运行 或我在使用 DbFunctions
时做错了什么的任何信息,我们将不胜感激。谢谢。
如果你使用 MS Sql 服务器你可以试试这个
var dateTimeNow=DateTime.Now;
var x = _dbContext.EPCRA_Events.Where(e => EF.Functions.DateDiffDay(e.DueDt, dateTimeNow) < 30).ToList();
即使可以翻译查询,它也将是一个糟糕的查询,因为它必须在过滤之前计算每一行的差异。索引无济于事,因为索引是根据存储的值构建的。
解决方法是提前计算截止日期,直接与字段进行比较
此代码将查找过去 30 天内的记录
var cutoff=DateTime.Now.AddDays(-30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt > cutoff)
.ToList();
虽然这将查找未来 30 天内的记录:
var cutoff=DateTime.Now.AddDays(30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt < cutoff)
.ToList();
虽然这将在接下来的 30 天内 return 记录,包括今天:
var cutoff=DateTime.Now.AddDays(30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt>=DateTime.Today && e.DueDt < cutoff)
.ToList();
这将忽略 NULL 并使用涵盖 DueDt
的任何索引
我正在尝试 运行 以下查询:
List<EPCRA_Events> x =
_dbContext.EPCRA_Events
.Where(e => e.DueDt.HasValue &&
(e.DueDt.Value - DateTime.Now).Days < 30)
.ToList();
但我一直收到错误消息
The LINQ expression ...xxx... could not be translated
在查看其他帖子后,我发现一个常见的解决方案是使用 DbFunctions
class。但是,在使用 Nuget 导入 Entity Framework 6.4.4 和 Microsoft.EntityFrameworkCore
5.0.9 后,我无法访问 class。此外,Entity
class 不在 System.Data
命名空间中。
如能提供有关如何将此查询发送至 运行 或我在使用 DbFunctions
时做错了什么的任何信息,我们将不胜感激。谢谢。
如果你使用 MS Sql 服务器你可以试试这个
var dateTimeNow=DateTime.Now;
var x = _dbContext.EPCRA_Events.Where(e => EF.Functions.DateDiffDay(e.DueDt, dateTimeNow) < 30).ToList();
即使可以翻译查询,它也将是一个糟糕的查询,因为它必须在过滤之前计算每一行的差异。索引无济于事,因为索引是根据存储的值构建的。
解决方法是提前计算截止日期,直接与字段进行比较
此代码将查找过去 30 天内的记录
var cutoff=DateTime.Now.AddDays(-30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt > cutoff)
.ToList();
虽然这将查找未来 30 天内的记录:
var cutoff=DateTime.Now.AddDays(30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt < cutoff)
.ToList();
虽然这将在接下来的 30 天内 return 记录,包括今天:
var cutoff=DateTime.Now.AddDays(30);
List<EPCRA_Events> x = _dbContext
.Where(e => e.DueDt>=DateTime.Today && e.DueDt < cutoff)
.ToList();
这将忽略 NULL 并使用涵盖 DueDt