How to retrieve latest record using RowKey or Timestamp in Azure Table storage

Neo picture Neo · Nov 14, 2016 · Viewed 11.8k times · Source

Tricky part is RowKey is string which is having value like Mon Nov 14 12:26:42 2016

I tried query using Timestamp like

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; }
    }

//below query gives full data 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

Answer

Vivien Chevallier picture Vivien Chevallier · Nov 14, 2016

Neo,

If you need to have the latest entry in your partition, using a string date time for the row key is not a good approach as Table Storage stores entities in ascending order based on the Row Key.

If at the current point you can change the value of your row key, use DateTime.UtcNow.Ticks:

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

With that approach, when querying your table, you will be able to take 1 entry corresponding to the latest.

If you can't change the value of your row key, you will have to retrieve all the entries in the partition, meaning loading all of it in memory, and then order them using the Timestamp to retrieve the last one. If you have a lot of entries this is definitely not a good approach.

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