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.
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);
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);
}