0

不知道为什么它抱怨这个错误,但是当将时间戳与 DateTime.now 进行比较时,我得到一个对象引用错误。这是简单的代码。

 public class EmailTempKey
    {
        public string Id { get; set; }
        public DateTime LastUpdated { get; set; }
        public bool ShouldBeDisposed { get; set; }
    }

//Linq Query to see if its been past 8 min
  var emails = session.Query<EmailTempKey>().Where(x => DateTime.Now > x.LastUpdated.AddMinutes(8)).ToList();

如果我删除 where 子句它可以工作,但显然我需要它。谢谢你的帮助

4

2 回答 2

3

当您表达 LINQ 查询时,请记住 RavenDB 必须在执行之前将其转换为 Lucene。因此,您需要考虑如何将特定字段与您传入的值进行比较。您写道:

Where(x => DateTime.Now > x.LastUpdated.AddMinutes(8))

您的LastUpdated字段需要为每条记录进行变异才能解析此查询。这不是 Lucene 或 Raven 可以做到的。仅仅因为你可以在 LINQ 中表达它并不意味着它对 Raven 有效。相反,你可以写:

Where(x => x.LastUpdated < DateTime.Now.AddMinutes(-8))

这是您指定的查询的代数等价物,应该可以工作,但仍然存在一些问题。

  • 您可能想要一个包容性比较,<=或者>=

  • 该查询将返回于 8 分钟之前的项目。我可能是错的,但我认为你的意思是你想要8 分钟前更新的项目,在这种情况下你会翻转比较:

    Where(x => x.LastUpdated >= DateTime.Now.AddMinutes(-8))
    
  • 使用DateTime.Now可能会有问题。您正在将服务器的本地时区设置强加到您的数据上。如果您的时区使用夏令时,那么当您的时钟转换时,每年两次您的查询都会得到错误的结果。即使您不遵循夏令时,如果您想将数据移动到其他地方(如云或 ISP),也会遇到问题。您还应该阅读我的帖子:反对 DateTime.Now 的案例。您应该将日期存储为 UTC,或者您可以使用DateTimeOffset- 它在 RavenDB 中运行良好。

  • 也许您没有意识到,但 RavenDB 已经Last-Modified在其元数据中为每个文档保留了一个值。如果您愿意,您可以使用自己的字段,但为什么要存储两次呢?您可以使用 Lucene 语法基于元数据进行查询:

    var results = session.Advanced.LuceneQuery<EmailTempKey>()
                         .WhereGreaterThan("@metadata.Last-Modified",
                                            DateTime.UtcNow.AddMinutes(8));
    

    如果您想坚持使用 LINQ 语法,则需要定义一个静态索引。

于 2013-05-01T16:17:32.797 回答
0

我认为这会解决它

如果日期时间 LastUpdated 可能为空,请选择以下解决方案之一

可能为空:

//Linq Query to see if its been past 8 min
  var emails = session.Query<EmailTempKey>().Where(x => x.LastUpdated == DateTime.MinValue || (DateTime.Now > x.LastUpdated.AddMinutes(8)).ToList();

不能为空:

//Linq Query to see if its been past 8 min
  var emails = session.Query<EmailTempKey>().Where(x => x.LastUpdated != DateTime.MinValue && (DateTime.Now > x.LastUpdated.AddMinutes(8)).ToList();
于 2013-05-01T13:01:30.967 回答