web-dev-qa-db-fra.com

Comment interroger toutes les lignes dans le stockage de table Windows Azure?

J'essaie d'obtenir une liste de toutes les entités dans ma table Azure.

Une idée de comment j'allais écrire cette requête?

J'utilise c # btw. Merci.

40
SKLAK

Pour répondre à votre question, vous pouvez faire quelque chose comme ceci:

var acc = new CloudStorageAccount(
                         new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
var entities = table.ExecuteQuery(new TableQuery<MyEntity>()).ToList();

Cependant, gardez à l'esprit que le service de table renvoie un maximum de 1000 entités en un seul appel. Si plus de 1 000 entités sont disponibles dans votre table, elle renvoie un continuation token qui peut être utilisé pour récupérer le prochain ensemble d'entités. La méthode ExecuteQuery gère en fait ce jeton de continuation donc si vous souhaitez annuler cette opération pour une raison quelconque, vous ne pouvez pas le faire.

Une meilleure approche serait d'utiliser la méthode ExecuteQuerySegmented et de faire traiter le token par votre application. Voici l'exemple de code pour le faire:

var acc = new CloudStorageAccount(
                         new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
TableContinuationToken token = null;
var entities = new List<MyEntity>();
do
{
    var queryResult = table.ExecuteQuerySegmented(new TableQuery<MyEntity>(), token);
    entities.AddRange(queryResult.Results);
    token = queryResult.ContinuationToken;
} while (token != null);
80
Gaurav Mantri

Un moyen peut-être plus efficace de récupérer des éléments de la table paresseusement est le suivant:

    public IEnumerable<T> GetAll<T>(string tableName) where T : class
    {
        var table = this.GetCloudTable(tableName);
        TableContinuationToken token = null;
        do
        {
            var q = new TableQuery<T>();
            var queryResult = Task.Run(() => table.ExecuteQuerySegmentedAsync(q, token)).GetAwaiter().GetResult();
            foreach (var item in queryResult.Results)
            {
                yield return item;
            }
            token = queryResult.ContinuationToken;
        } while (token != null);
    }

Si l'appelant parcourt le résultat de GetAll et trouve ce qu'il cherchait, il pourrait simplement break la boucle, et la méthode GetAll arrêterait de récupérer les éléments suivants. Cela pourrait être plus efficace, mais cela ne ferait pas beaucoup de différence si vous deviez vraiment récupérer tous les éléments.


Si vous utilisez C # 8.0, vous pouvez générer des méthodes asynchrones internes:

    public async Task<IEnumerable<T>> GetAll<T>(string tableName) where T : class
    {
        var table = this.GetCloudTable(tableName);
        TableContinuationToken token = null;
        do
        {
            var q = new TableQuery<T>();
            var queryResult = await table.ExecuteQuerySegmentedAsync(q, token);
            foreach (var item in queryResult.Results)
            {
                yield return item;
            }
            token = queryResult.ContinuationToken;
        } while (token != null);
    }
0
Alisson