MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment un IAsyncCursor est-il utilisé pour l'itération avec le pilote mongodb c# ?

Vous avez 3 options :

  1. Utilisez la méthode du pilote intégré (par exemple, ForEachAsync , ToListAsync ).
  2. Sur C# 8.0 et supérieur, vous pouvez convertir le IAsyncCursor dans un IAsyncEnumerable et utilisez await foreach ou tout opérateur LINQ asynchrone.
  3. Itérer sur le IAsyncCursor .
Méthodes de pilote intégrées

Le pilote a des méthodes d'extension de type LINQ pour IAsyncCursor , comme AnyAsync , ToListAsync , etc. Pour l'itération, il a ForEachAsync :

var cursor = await client.ListDatabasesAsync();
await cursor.ForEachAsync(db => Console.WriteLine(db["name"]));
Conversion en IAsyncEnumerable

Sur C # 8.0 et supérieur, il est plus agréable d'itérer avec await foreach (et utilisez LINQ asynchrone). Cela nécessite d'encapsuler le IAsyncCursor dans un IAsyncEnumerable .Vous pouvez le faire vous-même, mais comme il est important de bien faire certaines choses critiques (comme l'annulation et l'élimination), j'ai publié un package nuget :MongoAsyncEnumerableAdapter

var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
    Console.WriteLine(db["name"]);
}
Itération personnalisée

L'itération traditionnelle en C# se fait avec IEnumerable et foreach . foreach est le sucre syntaxique du compilateur. C'est en fait un appel à GetEnumerator , un using portée et un while boucle :

using (var enumerator = enumerable.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var current = enumerator.Current;
        // use current.
    }
}

IAsyncCursor est équivalent à IEnumerator (le résultat de IEnumerable.GetEnumerator ) tandis que IAsyncCursorSource est à IEnumerable . La différence est que ceux-ci prennent en charge async (et obtenez un lot à chaque itération et pas seulement un seul élément). Ainsi, vous pouvez implémenter l'ensemble using , while bouclez vous-même :

IAsyncCursorSource<int> cursorSource = null;

using (var asyncCursor = await cursorSource.ToCursorAsync())
{
    while (await asyncCursor.MoveNextAsync())
    {
        foreach (var current in asyncCursor.Current)
        {
            // use current
        }
    }
}