使用AddMonth方法的LINQ to Entities

36
这是我的代码:
 return Newsletterctx.Subscribers.Count(o =>
     o.Validated == false &&
     o.ValidationEmailSent == true &&
     o.SubscriptionDateTime.AddMonths(1) < DateTime.Now);

我遇到了这个错误:

LINQ to Entities 不认识 'System.DateTime AddMonths(Int32)' 方法,且该方法不能被转换为存储表达式。

4个回答

46

你可以使用SqlFunctions类。

 today =  DateTime.Now; return Newsletterctx.Subscribers.Count(o =>
 o.Validated == false &&
 o.ValidationEmailSent == true &&
 SqlFunctions.DateAdd("month",1,o.SubscriptionDateTime) <today);

3
我以前没有见过SqlFunctions,很有趣的东西。 - Alex KeySmith
我也成功了,谢谢 whitestream! - realPT

44

也许你可以将日期进行调整,以便进行测试:

DateTime testDate = DateTime.Now.AddMonths(-1);
return Newsletterctx.Subscribers.Count
            (o => o.Validated == false 
             && o.ValidationEmailSent == true 
             && o.SubscriptionDateTime < testDate);

在这种情况下,在声明testDate变量时会抛出异常:System.NullReferenceException:“对象引用未设置为对象实例。” CS$<>8__locals0为null。 - Ilkin Sam Elimov
@İlkinElimov 是的,如果该序列包含空引用,可能会发生这种情况。您可以通过首先使用 .Subscribers.Where(o => o!= null).Count(o => ... 进行筛选来解决这个问题。 - Fredrik Mörk

2

由于您正在使用不使用System.Datetime库的LINQ TO ENTITIES,因此必须在请求之外使用Datetime。

如果您希望使用固定日期,则可以在请求之外定义它:

DateTime compareDate = DateTime.Now.AddMonths(x);


2
现在,使用EntityFramework 6及以上版本,您可以直接使用System.Data.Entity.DbFunctions。
return Newsletterctx.Subscribers.Count(o =>
 o.Validated == false &&
 o.ValidationEmailSent == true &&
  DbFunctions.AddMonths(o.SubscriptionDateTime,1) < DateTime.Now);

然而,在这种情况下,使用由Fredrik Mörk提供的临时变量testDate会使用更少的资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接