Question

J'ai des objets qui a une propriété DateTime, comment puis-je interroger l'objet le plus ancien?

Après avoir demandé sur le forum db4o, je reçois la réponse:

Il est assez facile: créer Énuméré SODA-Query and prendre le premier / dernier objet du ObjectSet résultant. Ne pas itérer le ObjectSet (donc les objets ne seront pas activés), il suffit de prendre l'objet requis directement via #ObjectSet.Get(index).

S'il vous plaît noter: db4o supporte seulement un nombre limité de triages (par ordre alphabétique performants, numéros, objet) ids en exécution de la requête, vous avez peut-être stocker votre DateTime en millisecondes pour obtenir de bonnes performances.

Était-ce utile?

La solution

Tout d'abord, votre objet a besoin de garder une trace du temps lui-même, donc cela dépend de vos besoins:

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

Maintenant, vous pouvez interroger l'objet de quelque manière que vous le souhaitez, en utilisant Linq, SODA ou requêtes natives, par exemple.

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

Cependant, il y a un ensemble de pièges:

  1. Ne pas utiliser DateTime dans votre objet persisté. J'ai eu d'énormes problèmes avec eux. Je ne peux pas reproduire le problème, donc je ne pouvais pas le signaler, mais je ne peux personnellement pas recommander de les utiliser. Utilisez un long au lieu et copier les tiques de la DateTime respective. Conservez tous les temps en UTC, sauf si vous faites référence explicitement à l'heure locale, comme dans le cas des horaires d'autobus.
  2. Mettez un index sur le temps
  3. L'opération de commande pourrait être très, très lent pour de grandes quantités d'objets en raison de COR- 1133 . Si vous avez une grande quantité d'objets et vous connaissez l'âge approximatif de l'objet, essayez d'imposer une contrainte de where, parce que ce sera rapide. Voir aussi mon blogpost en ce qui concerne cette question de performance, ce qui peut devenir déjà très ennuyeux à ~ objets 50-100k.

Best,
Chris

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top