如何使用DateTime ?AddXXXX在链接到实体查询中起作用
本文关键字:实体 查询 起作用 链接 何使用 DateTime AddXXXX | 更新日期: 2023-09-27 18:12:07
我试图在查询中使用AddMonths
List<Entities.Subscriber> items = (from s in context.Subscribers
where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < DateTime.Now.AddMonths(-1)
select s).ToList();
但是我收到一个错误:
LINQ to Entities不能识别方法System。DateTimeAddMonths(Int32)'方法,并且该方法不能转换为存储表达式。
是否有一种方法,我可以在我的查询中使用这个函数?
最简单的解决方法是使用LINQ:
在之前计算一次时间限制DateTime limit = DateTime.Now.AddMonths(-1);
List<Entities.Subscriber> items = (from s in context.Subscribers
where s.Validated == false && s.ValidationEmailSent == true &&
s.SubscriptionDateTime < limit)
select s).ToList();
或者更容易读:
var items = context.Subscribers
.Where(s => !s.Validated &&
s.ValidationEmailSent &&
s.SubscriptionDateTime < limit)
.ToList();
在这里使用查询表达式没有任何好处,并且与true
和false
的显式比较在IMO上是丑陋的(除非您的属性当然是Nullable<bool>
类型)。
Jon Skeet已经提供了一个简单的修复,但是如果您希望DateTime.Now.AddMonths
位在数据库上运行,请尝试EntityFunctions.AddMonths
方法。
这是一种更通用的方法,当您无法在客户机上廉价或正确地复制表达式时,它尤其有用。
您可以将代码更改为:
DateTime oneMonth = DateTime.Now.AddMonths(-1)
List<Entities.Subscriber> items = (from s in context.Subscribers
where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < oneMonth
select s).ToList();
你必须这样做,因为AddMonth是一个。net函数,不能通过Linq to Entities转换成SQL。在代码中执行计算,然后使用得到的日期时间就可以了。