Как запросить самый старый объект из db4o? - PullRequest
1 голос
/ 14 марта 2010

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

После запроса на форуме db4o я получаю ответ:

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

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

1 Ответ

1 голос
/ 21 марта 2010

Прежде всего, ваш объект должен отслеживать само время, поэтому это зависит от ваших требований:

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

Лучшее
Chris

...