MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie wird ein IAsyncCursor für die Iteration mit dem mongodb c#-Treiber verwendet?

Sie haben 3 Möglichkeiten:

  1. Verwenden Sie die eingebaute Treibermethode (z. B. ForEachAsync , ToListAsync ).
  2. Auf C# 8.0 und höher können Sie den IAsyncCursor konvertieren in ein IAsyncEnumerable und verwenden Sie await foreach oder einen beliebigen asynchronen LINQ-Operator.
  3. Iterieren Sie über den IAsyncCursor .
Integrierte Treibermethoden

Der Treiber verfügt über einige LINQ-ähnliche Erweiterungsmethoden für IAsyncCursor , wie AnyAsync , ToListAsync usw. Für die Iteration gibt es ForEachAsync :

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

Auf C# 8.0 und höher ist es sicherlich angenehmer, mit await foreach zu iterieren (und asynchrones LINQ verwenden). Dazu muss der IAsyncCursor umschlossen werden in einem IAsyncEnumerable .Sie können es selbst tun, aber da es wichtig ist, einige kritische Dinge richtig zu machen (wie Stornierung und Entsorgung), habe ich ein Nuget-Paket veröffentlicht:MongoAsyncEnumerableAdapter

var cursor = await client.ListDatabasesAsync();
await foreach (var db in cursor.ToAsyncEnumerable())
{
    Console.WriteLine(db["name"]);
}
Benutzerdefinierte Iteration

Traditionelle Iteration in C# erfolgt mit IEnumerable und foreach . foreach ist der syntaktische Zucker des Compilers. Es ist eigentlich ein Aufruf von GetEnumerator , ein using Geltungsbereich und ein while Schleife:

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

IAsyncCursor entspricht IEnumerator (das Ergebnis von IEnumerable.GetEnumerator ) während IAsyncCursorSource ist zu IEnumerable . Der Unterschied besteht darin, dass diese async unterstützen (und erhalten Sie bei jeder Iteration einen Stapel und nicht nur ein einzelnes Element). So können Sie das ganze using implementieren , while Loop-Ding selbst:

IAsyncCursorSource<int> cursorSource = null;

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