我真的陷入Azure表存储的查询过滤器中。 我可以知道如何查询时间戳吗? 当我单独查询分区键1005时,我得到了我不想要的完整表格。 当我添加"和"带有时间戳的条件(尝试了很多格式,但它没有返回任何内容。下面的代码片段:
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));
答案 0 :(得分:15)
我可以将时间戳与Microsoft.WindowsAzure.Storage版本4.0.1.0一起使用。 只是和示例
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();
答案 1 :(得分:4)
属性名称区分大小写。它应该是Timestamp而不是TimeStamp。
答案 2 :(得分:4)
时间戳可用于查询Azure表存储中的行。
但是,您需要使用TableQuery.GenerateFilterConditionForDate
代替TableQuery.GenerateFilterCondition
。对于任何DateTime列,必须使用TableQuery.GenerateFilterConditionForDate
。
从代码示例中,为时间戳过滤器更改GenerateFilterCondition
到GenerateFilterConditionForDate
:
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));
答案 3 :(得分:3)
如果这是诊断表(例如WADLogsTable),我建议您将时间戳转换为分区键,然后查询。这将避免全表扫描,因为它是索引列。转换很简单,只是前置&#34; 0&#34;到了蜱虫。
var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);
// Now query PartitionKey >= lowerlimitPartitionKey
...
,其中
private string DateTimeToPartitionKey(DateTime dt)
{
return "0" + dt.Ticks;
}