问题
I am really stuck in my query filter on Azure table storage. May I know how to query with timestamp please? When I query for partition key to 1005 alone, I am getting the complete table which I don't want. When I added "and" condition with timestamp (tried with lots of formats but it is not returning anything. Code snippet below :
var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd");
string dateRangeFilter = TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1005"),
TableOperators.And,
TableQuery.GenerateFilterCondition("TimeStamp", QueryComparisons.GreaterThanOrEqual, lowerlimit));
回答1:
I am able to use the Timestamp with Microsoft.WindowsAzure.Storage version 4.0.1.0. Just and example
var query = TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("Level", QueryComparisons.Equal, "ERROR"),
TableOperators.And,
TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.GreaterThanOrEqual, DateTimeOffset.Now.AddDays(-20).Date));
var query2 = TableQuery.CombineFilters(query,
TableOperators.And,
TableQuery.GenerateFilterConditionForDate("Timestamp", QueryComparisons.LessThanOrEqual, DateTimeOffset.Now));
var exQuery = new TableQuery<LogEntry>().Where(query2);
CloudTableClient tableClient = _storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(_tableName);
var results = table.ExecuteQuery(exQuery).Select(ent => (T) ent).ToList();
回答2:
Property names are case-sensitive. It should be Timestamp and not TimeStamp.
回答3:
Timestamp can be used to query rows in Azure Table Storage.
However, you will need to use TableQuery.GenerateFilterConditionForDate
instead of TableQuery.GenerateFilterCondition
. For any DateTime column, TableQuery.GenerateFilterConditionForDate
must be used.
From your code sample, change GenerateFilterCondition
to GenerateFilterConditionForDate
for Timestamp filter:
var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd");
string dateRangeFilter = TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1005"),
TableOperators.And,
TableQuery.GenerateFilterConditionForDate("TimeStamp", QueryComparisons.GreaterThanOrEqual, lowerlimit));
回答4:
If this is a diagnostics table (e.g. WADLogsTable) I suggest you convert your timestamp to a partition key, then query on that. This would avoid a full table scan since it is an indexed column. Conversion is simple, just prepend "0" to the ticks.
var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);
// Now query PartitionKey >= lowerlimitPartitionKey
...
where
private string DateTimeToPartitionKey(DateTime dt)
{
return "0" + dt.Ticks;
}
来源:https://stackoverflow.com/questions/17325445/timestamp-query-in-azure