【发布时间】:2021-11-26 18:29:26
【问题描述】:
如果过期日期是 2 天或 15 天,我需要检查我所有的化学品并向用户发送警告。 我已经这样设置了,所以警告被发送了两次。到期前 2 周一次,到期前 2 天一次。
所以我有这个循环:
foreach (var chemical in _context.Chemical.Where(c => (c.DateOfExpiration - DateTime.Now).TotalDays == 15 || (c.DateOfExpiration - DateTime.Now).TotalDays == 2))
{
// send out notices
var base = _context.Base.Find(chemical.BaseId);
var catalyst = _context.Catalyst.Find(chemical.CatalystId);
_warningService.SendSafetyWarning(chemical, base, catalyst.Name);
}
但每当我运行它时,我都会收到此错误:
System.InvalidOperationException: 'The LINQ expression 'DbSet<Chemical>
.Where(p => (p.DateOfExpiration - DateTime.Now).TotalDays == 15 || (p.DateOfExpiration - DateTime.Now).TotalDays == 2)'
could not be translated.
我不确定为什么我运行它时会出现这个错误。
有没有更好的方法来做我想做的事情?
谢谢!
【问题讨论】:
-
EntityFunctions.DiffDays 可能会解决您的问题。
-
我同意@rb。就目前的代码而言,基本上每次在 for 循环中,DateTime.Now 都会发生变化,这意味着查询会发生变化,这显然不好。
-
我建议您创建两个要检查的日期,例如
var fifteenDays = DateTime.Today.AddDays(15);,然后您需要将截断的DateOfExpiration日期与它们进行比较。根据错误,我认为您使用的是较旧的 EF,除非您仅将日期存储在该列中,否则需要DbFunctions.TruncateTime(c.DateOfExpiration)。 -
@RB。您的意思是在我的
foreach循环中添加这样的内容?where EntityFunctions.DiffDays(DateTime.Now, c.DateOfExpiration) == 2 || EntityFunctions.DiffDays(DateTime.Now, c.DateOfExpiration) == 15 -
@Rb
EntityFunctions是否已弃用?您链接到的问题包含已弃用的 cmets?
标签: c# foreach entity-framework-core