Запрос отметки времени в Azure
Я действительно застрял в своем фильтре запросов в хранилище таблиц 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));
4 ответа
Я могу использовать метку времени с 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();
Временная метка может использоваться для запроса строк в хранилище таблиц 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));
Имена свойств чувствительны к регистру. Это должна быть метка времени, а не метка времени.
Если это диагностическая таблица (например, WADLogsTable), я предлагаю вам преобразовать вашу временную метку в ключ раздела, а затем запросить ее. Это позволит избежать полного сканирования таблицы, поскольку это индексированный столбец. Преобразование простое, просто добавьте "0" к тикам.
var lowerlimitPartitionKey = DateTimeToPartitionKey(lowerlimit);
// Now query PartitionKey >= lowerlimitPartitionKey
...
где
private string DateTimeToPartitionKey(DateTime dt)
{
return "0" + dt.Ticks;
}