これは非常にクールな問題です。
指定されたエントリの前後にあるエントリのみを検索する場合は、DateTime.Now.Ticks または (DateTime.Max.Ticks - DateTime.Now.Ticks) をRowKey を取得し、クエリで「Take」コマンドを使用して、最も近い X レコードを見つけます。
ただし、特定の場所の ID の後または前にある最も近い場所を見つける必要があるため、RowKeys に適していると思われる設計パターンの 1 つを次に示します。
- GPS 位置ごとに 2 つのエンティティを保存する必要があります。行キーが異なることを除いて、エンティティのデータは同じである必要があります
- 1 つのエンティティの RowKey は DateTime.UtcNow.Ticks で、プレフィックスは "A" (昇順) です。
- もう一方のエンティティには、DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks の RowKey があり、"D" (降順) などのプレフィックス文字があります。
たとえば、7 つの場所、Location1..thru..Location7 があるとします。ここでは、01 から 99 までのランダムな Tick 値を指定しました (簡単にするため)。MaxTicks が 100 であるとします。これにより、テーブルに次のデータが含まれるようになります。
Rowkey、エンティティ データ
- A----01、ロケーション 1
- A----50、ロケーション 2
- A----55、ロケーション 3
- A----66、ロケーション 4
- A----67、ロケーション 5
- A----90、場所6
- A----99、ロケーション 7
- D----01、ロケーション 7
- D----10、場所6
- D----33、場所5
- D----34、ロケーション 4
- D----45、ロケーション 3
- D----50、ロケーション 2
- D----99、ロケーション 1
これで、すべてのエンティティについて、その「反対の」Rowkey エンティティを簡単に計算できます。(RowKey を DateTime.MaxValue.Ticks から減算し、プレフィックスを A から D または D から A に反転するだけです)
したがって、Location3 の前にある 2 つのエンティティが必要な場合は、RowKey が "D----45" より大きく、"D----99" (最大) より小さいテーブルから 2 つのエンティティを取得するクエリを発行するだけです。 . また、Location3 の後に 2 行を取得する必要がある場合は、RowKey が "A-----55" より大きく、"A-----99" (最大) 未満である Take 2 を発行するだけです。「より小さい」基準を発行することは重要です。これにより、「A」に対してクエリを実行しているときに誤って「D」に出くわすことはありません。
バッチ トランザクション内のエンティティの両方のセットを更新/挿入して、両方またはいずれもテーブルに挿入されないようにして、「できあがり」を保証します。
このアプローチの欠点は、ストレージの 2 倍の料金を支払う必要があることです。
これが役に立ち、あまり混乱しないことを願っています