Запрос отметки времени в 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;
}
Другие вопросы по тегам