2
votes

Comment exécuter LINQ Count sur une requête Cosmos-db de manière asynchrone sur le SDK V3

J'ai une requête Cosmos-db SDK V3 dans mon code C # et je peux exécuter la méthode Count dessus si " allowSynchronousQueryExecution " est défini sur true ou GetItemsQueryIterator utilisé pour s'exécuter de manière asynchrone. Existe-t-il un autre moyen d'exécuter le compte de manière asynchrone d'une manière plus propre comme ci-dessous:

var count = await query.CountAsync();

Je sais que le SDK V2 prend en charge l'extrait de code ci-dessus.


0 commentaires

3 Réponses :


1
votes

Pour tous ceux qui trébuchent là-dessus, dans le SDK V3, vous pouvez effectuer les opérations suivantes:

var query = this.container.GetItemLinqQueryable<T>(
         requestOptions: new QueryRequestOptions
         {
             PartitionKey = new PartitionKey(yourKey),
             MaxItemCount = maxCount
         }
     )
     .Where(yourPredicate);

 var feedIterator = this.container.GetItemQueryIterator<T>(query.ToQueryDefinition());

 var results = new List<T>();
 while (feedIterator.HasMoreResults)
 {
   results.AddRange(await feedIterator.ReadNextAsync());
 }


0 commentaires

0
votes

Voici l'un des exemple de fonction que j'ai utilisé avec SDK V3,

public async Task<T> GetByIdAsync(string id, object partitionKeyValue = null)
        {
            var options = this.EnsureRequestOptions(partitionKeyValue);

            var sqlQuery = new QueryDefinition($"select * from {this.containerName} c where c.id = @id").WithParameter("@id", id);
            var iterator = this.container.GetItemQueryIterator<T>(
                sqlQuery,
                requestOptions: options);

            while (iterator.HasMoreResults)
            {
                var response = await iterator.ReadNextAsync().AnyContext();
                this.LogRequestCharge(response.RequestCharge, response.ActivityId);

                foreach (var result in response.Resource)
                {
                    return result;
                }
            }


0 commentaires

0
votes

Vous pouvez maintenant utiliser le code dans votre question, si vous utilisez GetItemLinqQueryable ();

Assurez-vous d'inclure Microsoft.Azure.Cosmos.Linq dans vos instructions d'utilisation.

/ p>

Exemple:

IOrderedQueryable<MyClass> linqQueryable = container.GetItemLinqQueryable<MyClass>();
Response<int> count = await linqQueryable.CountAsync();
var charge = count.RequestCharge;

Si vous souhaitez obtenir les frais de demande et / ou d'autres détails, utilisez peut utiliser quelque chose comme ce qui suit:

XXX

Voir: https://github.com/Azure/azure-cosmos-dotnet- v3 / pull / 729 et https: // github. com / Azure / azure-cosmos-dotnet-v3 / pull / 776 pour plus de détails


0 commentaires