C# Azure中的时间戳查询

C# Azure中的时间戳查询,c#,azure-storage,azure-table-storage,C#,Azure Storage,Azure Table Storage,我真的被Azure表存储上的查询过滤器卡住了。 我可以知道如何用时间戳查询吗? 当我单独查询1005的分区键时,我得到了我不想要的完整表。 当我添加带有时间戳的“and”条件时(尝试了很多格式,但没有返回任何内容。下面的代码片段: var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd"); string dateRangeFilter = TableQuery.CombineFilters( TableQue

我真的被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));

我可以在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();
var query=TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition(“级别”,QueryComparisons.Equal,“错误”),
表3.以及,
TableQuery.GenerateFilterConditionForDate(“Timestamp”,QueryComparisons.GreaterThanOrEqual,DateTimeOffset.Now.AddDays(-20.Date));
var query2=TableQuery.CombineFilters(查询,
表3.以及,
TableQuery.GenerateFilterConditionForDate(“Timestamp”,QueryComparisons.lessthanRequal,DateTimeOffset.Now));
var exQuery=new TableQuery()。其中(query2);
CloudTableClient tableClient=\u storageAccount.CreateCloudTableClient();
CloudTable=tableClient.GetTableReference(_tableName);
var results=table.ExecuteQuery(exQuery).Select(ent=>(T)ent.ToList();

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

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

var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);

// Now query PartitionKey >= lowerlimitPartitionKey
...
在哪里


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

但是,您需要使用
TableQuery.GenerateFilterConditionForDate
而不是
TableQuery.GenerateFilterCondition
。对于任何日期时间列,必须使用
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));

请不要查询时间戳。这将使执行非常缓慢,因为它没有索引。Kurkula:可以告诉Azure索引时间戳吗?这将对一百万个不同的用例有用。@MrMambo007不,您不能告诉索引时间戳。@Kurkula,如果您是通过分区键和行键以及s时间戳为>上周?还会有减速吗?@jsucupira,时间戳有用的原因是,假设您有一个Azure函数从表存储中调用项,该函数正在缓存长操作的结果(按分区和行键唯一)但是缓存应该只持续一周。因此,我的想法是,如果您可以在一周前通过网络传输项目时保存时间戳>。只要在查询中包含时间戳不会减慢任何速度,它似乎是最佳的,特别是如果表存储中的项目很大,并且您为Azure功能支付内存*时间的话。是/否?如何使用时间戳检索最新记录?
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));