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