C# 如何从db4o查询最早的对象?

C# 如何从db4o查询最早的对象?,c#,db4o,C#,Db4o,我有具有DateTime属性的对象,如何查询最早的对象 在db4o论坛上提问后,我得到了答案: 这非常简单:创建一个排序的SODA查询,并从结果ObjectSet中获取第一个/最后一个对象。不要迭代对象集(因此对象不会被激活),只需通过#ObjectSet.Get(index)直接获取所需的对象即可 请注意:db4o在查询执行中只支持一组有限的性能排序(字母、数字、对象ID),因此您可能必须将DateTime存储为毫秒以获得良好的性能 首先,您的对象需要跟踪时间本身,因此它取决于您的需求: cl

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

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

这非常简单:创建一个排序的
SODA查询,并从结果
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();
IObjectContainer=。。。;
Customer oldestCustomer=container.Query().OrderBy(p=>p.DateSignedUp.First();
但是,存在一系列陷阱:

  • 不要在持久化对象中使用
    DateTime
    。我和他们有很多问题。我不能重现这个问题,所以我还不能报告它,但我个人不建议使用它们。改为使用
    long
    ,并从相应的
    DateTime
    复制刻度。将所有时间存储为UTC,除非您明确指的是当地时间,例如在公交车时刻表的情况下
  • 对时间进行索引
  • 对于大量的对象,订单操作可能会非常非常慢,因为。如果您有大量对象,并且您知道对象的大致年龄,请尝试在其中施加
    约束,因为这样会很快。关于性能问题,在大约50-100k的对象上,这可能会变得非常恼人
  • 最佳,

    Chris

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

    class Customer
    {
        public DateTime DateSignedUp {get; private set;}
        // ...
    }
    
    现在,您可以使用Linq、SODA或本机查询以任何方式查询对象,例如

    IObjectContainer container = ...;
    Customer oldestCustomer = container.Query<Customer>().OrderBy(p => p.DateSignedUp).First();
    
    IObjectContainer=。。。;
    Customer oldestCustomer=container.Query().OrderBy(p=>p.DateSignedUp.First();
    
    但是,存在一系列陷阱:

  • 不要在持久化对象中使用
    DateTime
    。我和他们有很多问题。我不能重现这个问题,所以我还不能报告它,但我个人不建议使用它们。改为使用
    long
    ,并从相应的
    DateTime
    复制刻度。将所有时间存储为UTC,除非您明确指的是当地时间,例如在公交车时刻表的情况下
  • 对时间进行索引
  • 对于大量的对象,订单操作可能会非常非常慢,因为。如果您有大量对象,并且您知道对象的大致年龄,请尝试在其中施加
    约束,因为这样会很快。关于性能问题,在大约50-100k的对象上,这可能会变得非常恼人
  • 最佳,

    克里斯

    谢谢你,克里斯,很高兴知道这件事。没有在skype上看到你,我现在在twitter上关注你。谢谢,克里斯,很高兴知道这一点。没有在skype上看到你,我现在在twitter上跟踪你。