10

我真的被困在 Azure 表存储上的查询过滤器中。请问我可以知道如何使用时间戳查询吗?当我单独查询 1005 的分区键时,我得到了我不想要的完整表。当我添加带有时间戳的“and”条件时(尝试了很多格式,但它没有返回任何内容。代码片段如下:

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));
4

4 回答 4

23

我可以将时间戳与 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();
于 2014-07-02T19:04:22.450 回答
7

属性名称区分大小写。它应该是时间戳而不是时间戳。

于 2015-02-17T20:42:45.810 回答
7

时间戳可用于查询 Azure 表存储中的行。

但是,您将需要使用TableQuery.GenerateFilterConditionForDate而不是TableQuery.GenerateFilterCondition. 对于任何 DateTime 列,TableQuery.GenerateFilterConditionForDate必须使用。

从您的代码示例中,更改GenerateFilterConditionGenerateFilterConditionForDate时间戳过滤器:

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));
于 2015-09-16T03:13:34.747 回答
3

如果这是一个诊断表(例如 WADLogsTable),我建议您将时间戳转换为分区键,然后对其进行查询。这将避免全表扫描,因为它是一个索引列。转换很简单,只需在刻度前加上“0”。

var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);

// Now query PartitionKey >= lowerlimitPartitionKey
...

在哪里

private string DateTimeToPartitionKey(DateTime dt)
{
    return "0" + dt.Ticks;
}
于 2015-09-01T10:18:06.257 回答