如何从db4o查询最旧的对象?

时间:2010-03-14 14:17:26

标签: c# db4o

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

然而,存在一系列陷阱:

  1. 请勿在持久对象中使用DateTime。我遇到了很多问题。我无法重现问题所以我还无法报告,但我个人不建议使用它们。请改用long并复制相应DateTime的刻度。以UTC格式存储所有时间,除非您明确提及当地时间,例如公交时刻表。
  2. 在时间上加上一个索引
  3. 由于issue COR-1133,对于大量对象,订单操作可能非常非常慢。如果您有大量对象并且您知道对象的大致年龄,请尝试强加where约束,因为这样会很快。 See also my blogpost关于性能问题,在~50-100k对象上已经变得非常烦人。
  4. 最佳,
    克里斯