sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan bruges en IAsyncCursor til iteration med mongodb c#-driveren?

Du har 3 muligheder:

  1. Brug den indbyggede drivermetode (f.eks. ForEachAsync , ToListAsync ).
  2. På C# 8.0 og nyere kan du konvertere IAsyncCursor ind i en IAsyncEnumerable og brug await foreach eller enhver asynkron LINQ-operatør.
  3. Gentag over IAsyncCursor .
Indbyggede drivermetoder

Driveren har nogle LINQ-lignende udvidelsesmetoder til IAsyncCursor , som AnyAsync , ToListAsync , osv. Til iteration har den ForEachAsync :

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

På C# 8.0 og nyere er det meget bedre at iterere med await foreach (og brug async LINQ). Dette kræver indpakning af IAsyncCursor i en IAsyncEnumerable .Du kan gøre det selv, men da det er vigtigt at få nogle vigtige ting rigtigt (såsom annullering og bortskaffelse), har jeg udgivet en nuget-pakke:MongoAsyncEnumerableAdapter

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

Traditionel iteration i C# udføres med IEnumerable og foreach . foreach er compilerens syntaktiske sukker. Det er faktisk et opkald til GetEnumerator , en using omfang og et while sløjfe:

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

IAsyncCursor svarer til IEnumerator (resultatet af IEnumerable.GetEnumerator ) mens IAsyncCursorSource er at IEnumerable . Forskellen er, at disse understøtter async (og få en batch hver iteration og ikke kun en enkelt vare). Så du kan implementere hele using , while loop ting selv:

IAsyncCursorSource<int> cursorSource = null;

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


  1. klasser og grænseflader til at skrive maskinskrevne modeller og skemaer af Mongoose i Typescript ved hjælp af definitivttyped

  2. mongo - rubin forbindelsesproblem

  3. DbRef med Mongoose - mongoose-dbref eller befolke?

  4. Hvordan konverterer man en pymongo.cursor.Cursor til en diktat?