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

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

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

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

有帮助吗?

解决方案

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

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

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

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

然而,存在一系列陷阱:

  1. 不要使用 DateTime 在你持久化的对象中。我和他们有很大的问题。我无法重现该问题,因此我还无法报告该问题,但我个人不建议使用它们。用一个 long 相反,并从相应的复制刻度 DateTime. 。将所有时间存储为 UTC 时间,除非您明确引用当地时间(例如公交车时刻表)。
  2. 给时间加上索引
  3. 对于大量对象,排序操作可能非常非常慢,因为 问题 COR-1133. 。如果您有大量物体并且您知道物体的大致年龄,请尝试强加一个 where 约束,因为那样会很快。 另请参阅我的博文 关于性能问题,对于大约 50-100k 对象来说,这可能会变得非常烦人。

最好的,
克里斯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top