如何使用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)'方法,并且该方法不能转换为存储表达式。

是否有一种方法,我可以在我的查询中使用这个函数?

如何使用DateTime ?AddXXXX在链接到实体查询中起作用

最简单的解决方法是使用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();

在这里使用查询表达式没有任何好处,并且与truefalse的显式比较在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。在代码中执行计算,然后使用得到的日期时间就可以了。