получить большой объем данных из хранилища Azure и обработать его - PullRequest
0 голосов
/ 24 января 2019

Мне нужно перенести некоторые данные из хранилища Azure в базу данных Sql.

У меня есть следующий код:

class AzureDataAccessManager : IAzureDataAccessManager
{
    private readonly CloudTable tableClient;

    private readonly CloudStorageAccount storageAccount;

    public string TableName { get; }

    public AzureDataAccessManager(string connectionString, string tableName)
    {
        TableName = tableName ?? throw new ArgumentNullException(nameof(tableName));

        if (connectionString == null) throw new ArgumentNullException(nameof(connectionString));

        storageAccount = CloudStorageAccount.Parse(connectionString);

        tableClient = storageAccount.CreateCloudTableClient().GetTableReference(TableName);
    }

    public List<T> QueryAllRecords<T>() where T : class, ITableEntity, new()
    {
        TableContinuationToken token = null;

        var entities = new List<T>();
        do
        {
            var queryResult = tableClient.ExecuteQuerySegmented(new TableQuery<T>(), token);
            entities.AddRange(queryResult.Results);
            token = queryResult.ContinuationToken;

        } while (token != null);

        return entities;
    }
}

И я получаю все записи, подобные этой:

var result = azureTableManager.QueryAllRecords<AzureCpaDataEntity>();

Проблема в том, что я не знаю, сколько у меня будет строк.Что если он будет слишком большим?Может быть, пройти через некоторые диапазоны (10 тысяч или что-то еще), но, как я вижу, в List нет соответствующего метода.

Помогите мне с некоторыми решениями или идеями, пожалуйста!

Спасибо!

1 Ответ

0 голосов
/ 24 января 2019

Код вопроса уже получает результаты в пакетном режиме.Вместо ожидания всех из них метод можно превратить в итератор и немедленно вернуть каждый пакет:

public IEnumerable<List<T>> QueryRecords<T>() where T : class, ITableEntity, new()
{
    TableContinuationToken token = null;

    do
    {
        var queryResult = tableClient.ExecuteQuerySegmented(new TableQuery<T>(), token);
        token = queryResult.ContinuationToken;
        yield return queryResult.Results;

    } while (token != null);
}

Результаты также должны обрабатываться пакетами:

foreach(var batch in QueryRecords<AzureCpaDataEntity>())
{
    ProcessTheBatch(batch);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...