web-dev-qa-db-ja.com

Azure Table StorageでRowKeyまたはTimestampを使用して最新のレコードを取得する方法

トリッキーな部分はRowKeystringであり、Mon Nov 14 12:26:42 2016のような値を持っています

Timestampを使用してクエリを試しました

var lowerlimit = DateTime.UtcNow; // its should be nearer to table timestamp data.
            TableQuery<TemperatureEntity> query2 = new TableQuery<TemperatureEntity>().Where(TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual,lowerlimit));
            var test = table.ExecuteQuery(query2);

MyEntity.cs

  public class MyEntity : TableEntity
    {
        public MyEntity(string partitionKey, string rowKey)
        {
            this.PartitionKey = partitionKey;
            this.RowKey = rowKey;
        }

        public MyEntity() { }

        public Int64 DevideId { get; set; }

        public string RowKey { get; set; }
    }

//以下のクエリは完全なデータを提供しますProgram.cs

// Retrieve the storage account from the connection string.
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                CloudConfigurationManager.GetSetting("StorageConnectionString"));

            // Create the table client.
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            // Create the CloudTable object that represents the "TemperatureData" table.
            CloudTable table = tableClient.GetTableReference("TemperatureData");

            // retrive data
            TableQuery<TemperatureEntity> query = new TableQuery<TemperatureEntity>();
            var data = table.ExecuteQuery(query);

enter image description here

12
Neo

ネオ、

パーティションに最新のエントリが必要な場合、テーブルストレージは行キーに基づいてエンティティを昇順で格納するため、行キーに文字列日付時刻を使用することは適切なアプローチではありません。

現時点で行キーの値を変更できる場合は、DateTime.UtcNow.Ticksを使用します。

var invertedTimeKey = DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks

そのアプローチを使用すると、テーブルをクエリするときに、最新のエントリに対応する1つのエントリを取得できます。

行キーの値を変更できない場合は、パーティション内のすべてのエントリを取得する必要があります。つまり、すべてのエントリをメモリにロードしてから、タイムスタンプを使用してそれらを順序付けし、最後のエントリを取得します。エントリが多い場合、これは間違いなく良い方法ではありません。

var lastResult = results.OrderByDescending(r => r.Timestamp).FirstOrDefault();
21

Azure Table ServiceはOrder By機能をサポートしていないため、現在の設定のみのオプションでは、すべてのエンティティをダウンロードし、クライアント側で逆に並べ替えます。テーブル内のエンティティの数が多くなると、これは明らかに最適なソリューションではありません。

その他のオプション(アプリケーションの再設計が必要になります)は、日付/時刻の値を逆ティックで変換することです。

var rowKey = (DateTime.MaxValue.Ticks - DateTimeValueForRowKey.Ticks).ToString("d19")

これにより、最新のエントリがテーブルの下部ではなく、上部に追加されます。最新のエントリを取得するには、テーブルから最初のエンティティを取得する必要があります。

9
Gaurav Mantri