1

我有具有 DateTime 属性的对象,我如何查询最旧的对象?

在 db4o 论坛上询问后,我得到了答案:

这很容易:SODA-Query and从结果中创建一个排序的第一个/最后一个对象ObjectSet。不要迭代ObjectSet(因此不会激活对象),只需通过#ObjectSet.Get(index).

请注意:db4o 在查询执行中仅支持一组有限的性能排序(字母、数字、对象 ID),因此您可能必须将 DateTime 存储为毫秒才能获得良好的性能。

4

1 回答 1

1

首先,您的对象需要跟踪时间本身,因此这取决于您的要求:

class Customer
{
    public DateTime DateSignedUp {get; private set;}
    // ...
}

现在,您可以使用 Linq、SODA 或本机查询以任何您喜欢的方式查询对象,例如

IObjectContainer container = ...;
Customer oldestCustomer = container.Query<Customer>().OrderBy(p => p.DateSignedUp).First();

但是,有一组陷阱:

  1. 不要DateTime在您的持久对象中使用。我和他们有很大的问题。我无法重现这个问题,所以我还不能报告它,但我个人不建议使用它们。改用 along并从相应的DateTime. 以 UTC 存储所有时间,除非您明确指的是当地时间,例如在公交车时刻表的情况下。
  2. 在时间上放一个索引
  3. 由于问题 COR-1133,对于大量对象,订单操作可能非常非常慢。如果您有大量对象并且您知道对象的大致年龄,请尝试施加where约束,因为这样会很快。另请参阅我关于该性能问题的博文,在大约 50-100k 个对象上已经变得非常烦人。

最好的,
克里斯

于 2010-03-21T18:36:29.813 回答