Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linq to Entities查询中使用DateTime.AddXXXX函数?_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 如何在Linq to Entities查询中使用DateTime.AddXXXX函数?

C# 如何在Linq to Entities查询中使用DateTime.AddXXXX函数?,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我试图在查询中使用AddMonths List<Entities.Subscriber> items = (from s in context.Subscribers where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < DateTime.Now.AddMonths(-1)

我试图在查询中使用
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();
List items=(来自context.Subscribers中的)
其中s.Validated==false&&s.ValidationEmailSent==true&&s.SubscriptionDateTime
但我收到了一个错误:

LINQ to实体无法识别方法“System.DateTime” AddMonths(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();
DateTime limit=DateTime.Now.AddMonths(-1);
列表项=(来自context.Subscribers中的)
其中s.Validated==false&&s.ValidationEmailSent==true&&
s、 SubscriptionDateTime<限制)
选择s.ToList();
或者更容易理解:

var items = context.Subscribers
                   .Where(s => !s.Validated &&
                               s.ValidationEmailSent &&
                               s.SubscriptionDateTime < limit)
                   .ToList();
var items=context.Subscribers
.其中(s=>!s&&
s、 验证邮件发送&&
s、 SubscriptionDateTime<限制)
.ToList();

在这里使用查询表达式没有任何好处,在我看来,与
true
false
进行显式比较非常困难(当然,除非您的属性类型为
Nullable
)。

您可以将代码更改为:

 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();
DateTime oneMonth=DateTime.Now.AddMonths(-1)
列表项=(来自context.Subscribers中的)
其中s.Validated==false&&s.ValidationEmailSent==true&&s.SubscriptionDateTime<一个月
选择s.ToList();

您必须这样做,因为AddMonth是一个.NET函数,不能通过LINQtoEntities转换为SQL。在代码中执行计算,然后使用生成的日期时间将起作用。

Jon Skeet已经提供了一个简单的修复程序,但是如果您想要
日期时间。现在。AddMonths
位在数据库上运行,请尝试该方法


这是一种更通用的方法,当您无法在客户端上廉价或正确地复制表达式时尤其有用。

如果您使用的是DateTime,则这是一种很好的方法。现在。。。但是如果您需要使用s.SuscriptionDateTime中的值加上月份,Ani的答案会更好。@Romias:在这种情况下,它将回答一个不同的问题:)哈哈。。。你是对的。。。我在我的问题中评论了思考:)