1

DateTimeプロパティを持つオブジェクトがありますが、最も古いオブジェクトをクエリするにはどうすればよいですか?

db4oフォーラムで質問した後、私は答えを得ました:

非常に簡単です。SODA-Query and結果のから最初/最後のオブジェクトを取得してソートされたものを作成しますObjectSet。(したがって、オブジェクトはアクティブ化されません)を繰り返さないでください。ObjectSet必要なオブジェクトを、を介して直接取得して#ObjectSet.Get(index)ください。

注意:db4oは、クエリ実行でパフォーマンスの高い並べ替え(アルファベット順、数値、オブジェクトID)の限られたセットのみをサポートするため、良好なパフォーマンスを実現するには、DateTimeをミリ秒単位で保存する必要があります。

4

1 に答える 1

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〜10万個のオブジェクトで非常に煩わしいものになる可能性があります。

最高、
クリス

于 2010-03-21T18:36:29.813 に答える