Azure Таблица: Как написать запрос диапазона для фильтрации по ключу раздела - PullRequest
0 голосов
/ 14 апреля 2020

Я округляю текущую дату UT C до ближайшей минуты и преобразую ее в тики, чтобы сохранить результат как PartitionKey в Azure Табличном хранилище. Я хотел бы выполнить запрос диапазона, чтобы получить определенные c диапазоны ключей раздела в коде. Я использую C#, но явно нижеуказанные операции LINQ не поддерживаются.

var tableQuery = cloudTable.CreateQuery<Log>().Where(x => long.Parse(x.PartitionKey) <= ticks); 

throws

System.NotSupportedException: 'The expression (Parse([10007].PartitionKey) <= 637224147600000000) is not supported.'

Я также пытался String.Compare(), но это не так работать тоже. Итак, как мне написать отфильтрованный запрос в C#, чтобы получить записи меньше или равные заданным тикам? Обратите внимание, что ключ раздела выбирается таким образом, чтобы записи могли естественно сортироваться в порядке убывания времени.

1 Ответ

2 голосов
/ 14 апреля 2020

Ниже приведен пример, который я использовал для получения данных. Попробуйте ниже запрос с вашим условием. Я думаю, что это должно работать.

public async Task<Advertisement> GetAdvertisementBy(string id, string user)
    {
        List<Advertisement> list = new List<Advertisement>();
        // Initialize the continuation token to null to start from the beginning of the table.
        TableContinuationToken continuationToken = null;
        var filter1 = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, user);
        var filter3 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, id);
        var combine = TableQuery.CombineFilters(filter1, TableOperators.And, filter3);
        TableQuery<Advertisement> query = new TableQuery<Advertisement>().Where(combine);
        do
        {
            // Retrieve a segment (up to 1,000 entities).
            TableQuerySegment<Advertisement> tableQueryResult = await base.Table.ExecuteQuerySegmentedAsync(query, continuationToken);
            // Assign the new continuation token to tell the service where to
            // continue on the next iteration (or null if it has reached the end).
            continuationToken = tableQueryResult.ContinuationToken;
            list.AddRange(tableQueryResult.Results);
            // Loop until a null continuation token is received, indicating the end of the table.
        } while (continuationToken != null);

        return list.FirstOrDefault();
    }
...