Как запросить самый старый объект из db4o?

У меня есть объекты, у которых есть свойство DateTime, как я могу запросить самый старый объект?

Спросив на форуме db4o, я получаю ответ:

Это довольно просто: создать отсортированный SODA-Query and и взять первый / последний объект из полученного ObjectSet. Не повторяйте ObjectSet (поэтому объекты не будут активированы), просто возьмите требуемый объект напрямую через #ObjectSet.Get(index).

Обратите внимание: db4o поддерживает только ограниченный набор эффективных сортировок (по алфавиту, числам, идентификаторам объектов) при выполнении запроса, поэтому, возможно, вам придется сохранять DateTime в миллисекундах для достижения хорошей производительности.


person Benny    schedule 14.03.2010    source источник


Ответы (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 в своем постоянном объекте. У меня с ними были огромные проблемы. Я не могу воспроизвести проблему, поэтому пока не могу сообщить о ней, но лично я не могу рекомендовать их использовать. Вместо этого используйте long и скопируйте галочки из соответствующего DateTime. Сохраняйте все время в формате UTC, если вы явно не ссылаетесь на местное время, например, в случае расписания автобусов.
  2. Поставьте индекс на время
  3. Операция заказа может быть очень и очень медленной для большого количества объектов из-за проблемы COR-1133 . Если у вас много объектов и вы знаете приблизительный возраст объекта, попробуйте наложить where ограничение, потому что это будет быстро. См. также мое сообщение в блоге об этой проблеме с производительностью, которая может стать очень раздражающей уже при ~ 50-100 тыс. объектов.

Бест,
Крис

person mnemosyn    schedule 21.03.2010
comment
спасибо, Крис, рад узнать об этом. не видел вас в скайпе, и теперь я подписан на вас в твиттере. - person Benny; 22.03.2010