Нужен пример для запроса таблицы Azure с использованием ExecuteQuerySegmentedAsync - PullRequest
0 голосов
/ 09 октября 2018

Я просто пытаюсь получить все сущности в таблице Azure, соответствующие определенному имени поля, и не могу найти какие-либо недавние примеры, из которых можно извлечь уроки.

В конечном итоге я хочу отобразитьрезультаты в таблице HTML вернулись к моему мнению , поэтому я думал, что List<ActivityModel> будет иметь смысл.Либо это, либо IEnumerable, поскольку мне не нужно менять какие-либо объекты (просто прочитайте).В любом случае я борюсь с основными понятиями.

public async Task<List<ActivityModel>> GetActivitiesAsync(string domainName)
    {
        CloudTable cloudTable = TableConnection("NodeEvents");
        TableQuery<ActivityModel> query = new TableQuery<ActivityModel>().Where(
            TableQuery.GenerateFilterCondition("DomainName", QueryComparisons.Equal, domainName)
        );

        //tried many examples of continuation tokens/etc
    }

Проблема, с которой я сталкиваюсь, заключается в том, что все последние SDK используют асинхронные вызовы с использованием ContinuationToken, и я не могу найтилюбые хорошие примеры.Кажется, это должно быть простой задачей.Любая помощь приветствуется.

Пытался следовать здесь , но примеры ссылались на методы и операции, которые больше не доступны.

1 Ответ

0 голосов
/ 09 октября 2018

Это сработало для меня.Мне не удалось найти что-либо, показывающее недавнее использование SDK Azure Tables.Надеюсь, это работает для других.Еще пара вещей, на которые стоит обратить внимание:

  1. В таблице тысячи сущностей, и я хотел всего около 500.Хотя приведенный ниже код работает, он требует некоторой работы над использованием .Take(int).Насколько я понимаю, метод "Take" только регулирует количество записей, возвращаемых за запрос.Поскольку мне, вероятно, придется иметь дело с токеном продолжения, для его установки, равной 5, потребуется только 5 сущностей на запрос до конца списка.

  2. Я добавил счетчик индекса, чтобы сломатьна случай, если мы получим более 500 записей, однако мое тестирование показывает 2000+ записей против 5000+ без него, так что, возможно, это является результатом асинхронного характера вызова?

    public async Task<List<ActivityModel>> GetActivitiesAsync(string domainName)
    {
        List<ActivityModel> activities = new List<ActivityModel>();
        CloudTable cloudTable = TableConnection("NodeEvents");
        string filter = TableQuery.GenerateFilterCondition("DomainName", QueryComparisons.Equal, domainName);
        TableContinuationToken continuationToken = null;
    
        do
        {
            var result = await cloudTable.ExecuteQuerySegmentedAsync(new TableQuery<ActivityModel>().Where(filter), continuationToken);
            continuationToken = result.ContinuationToken;
            int index = 0;
            if (result.Results != null)
            {
                foreach (ActivityModel entity in result.Results)
                {
                    activities.Add(entity);
                    index++;
                    if (index == 500)
                        break;
                }
            }
    
        } while (continuationToken != null);
    
        return activities;
    }
    
...