【问题标题】:How can i use DateTime.AddXXXX functions in a Linq-to-Entities query?如何在 Linq-to-Entities 查询中使用 DateTime.AddXXXX 函数?
【发布时间】:2011-10-24 14:15:11
【问题描述】:

我正在尝试在查询中使用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.DateTime” AddMonths(Int32)' 方法,并且该方法不能翻译成 存储表达式。

有没有办法在我的查询中使用这个函数?

【问题讨论】:

    标签: c# linq entity-framework linq-to-entities


    【解决方案1】:

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

    或者更易读的 IMO:

    var items = context.Subscribers
                       .Where(s => !s.Validated &&
                                   s.ValidationEmailSent &&
                                   s.SubscriptionDateTime < limit)
                       .ToList();
    

    在这里使用查询表达式没有任何好处,并且与 truefalse 的显式比较是丑陋的 IMO(当然,除非您的属性是 Nullable&lt;bool&gt; 类型)。

    【讨论】:

    • 如果您正在使用 DateTime.Now,这很好...但是如果您需要使用 s.SuscriptionDateTime 中的值添加月份,那么 Ani 的答案会更好。
    • @Romias:在这种情况下,它会回答一个不同的问题:)
    • 哈哈......你说得对......我评论了我的问题:)
    【解决方案2】:

    Jon Skeet 已经提供了一个简单的修复,但如果您希望 DateTime.Now.AddMonths 位在数据库上运行,请尝试 EntityFunctions.AddMonths 方法。

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

    【讨论】:

      【解决方案3】:

      您可以将代码更改为:

       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。在您的代码中执行计算,然后使用生成的日期时间即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多