2015-04-02 13 views
6

Ich habe eine Beispiel-App mit den 1.0 und 2.0 C# -Treibern für MongoDb erstellt.Ergebnisse von 2.0 erhalten MongoDb C# -Treiber

Sie serialisieren die gleichen Objekte und ich kann mit beiden schreiben und von der 1.0 lesen. Aber ich bin nicht in der Lage, FindAsync in der 2.0 zu verwenden, um mir irgendwelche Ergebnisse zu geben.

Hier ist meine 1.0-Abfrage, die ein Dokument zurückgibt:

var results = collection.AsQueryable<FlatCatalogItem>() 
         .FirstOrDefault(c => c.BatchId == "2015.01.27" 
              && c.Upcs.Any(u => u.UPC == "123456803")); 

Meine 2.0 Abfrage die gleichen Daten mit dem FindAsync sieht wie folgt aus:

var task = collection.FindAsync(item => item.BatchId == "2015.01.27" 
            && item.Upcs.Any(u => u.UPC == "123456803")); 
task.Wait(); 
var results = task.Result; 

Die AsyncCursor, die von Ergebnis zurückgegeben hat nichts drin.

Dies könnte meine Ignoranz mit async sein und warten, oder vielleicht habe ich etwas anderes mit den 2.0 Methoden find? Beachten Sie, dass ich nicht die legacy 2.0 drivers

Antwort

9

Die neue API ist async -nur sollten Sie nicht darauf blockieren. Es ist nicht skalierbar und könnte möglicherweise zu Deadlocks führen. Verwenden Sie async-await den ganzen Weg oder verwenden Sie weiterhin die alte API. In einer async Methode sollte die Abfrage wie folgt aussehen:

async Task Foo() 
{ 
    FlatCatalogItem first = await collection. 
     Find(c => c.BatchId == "2015.01.27" && c.Upcs.Any(u => u.UPC == "123456803")). 
     FirstOrDefaultAsync(); 

    // use first 
} 
+0

Irgendeine Idee, warum sie eine FindAsync- und eine Find-Methode haben? Beide haben eine FirstOrDefaultAsync-Methode für sie. –

+3

@ runxc1BretFerrier Der Unterschied ist der Rückgabewert 'FindAsync' gibt einen' IAsyncCursor' zurück während 'Find'' IFindFluent' zurückgibt. Mit IFindFluent können Sie die Suche weiter definieren, bevor Sie sie tatsächlich ausführen (z. B. eine Projektion oder Sortierung hinzufügen). 'FindAsync' führt die Abfrage sofort aus und gibt einen Cursor zurück. Sie können einen Cursor von "IFindFluent" mit "ToCursorAsync" erhalten. – i3arnon

+0

@ runxc1BretFerrier 'IAsyncCursor' hat nicht' FirstOfDefaultAsync', obwohl ... – i3arnon

2

verwenden möchten Können Sie dies bitte versuchen?

var task = collection.Find(item => item.BatchId == "2015.01.27" 
            && item.Upcs.Any(u => u.UPC == "123456803")).FirstOrDefaultAsync(); 

task.Wait(); 
var results = task.Result; 

Ich versuche mich auch an die neue API zu gewöhnen.

+0

Immer noch nicht sicher, wie die Asynchron-find-Methoden verwenden, aber das funktioniert. – paqogomez

2

Oder vielleicht ein wenig mehr elegant:

var result = collection.Find(item => item.BatchId == "2015.01.27" 
            && item.Upcs.Any(u => u.UPC == "123456803")) 
         .FirstOrDefaultAsync().Result; 
+0

Oder gibt dies nicht das Ergebnis zurück, bevor die asynchrone Operation abgeschlossen ist? – makhdumi

Verwandte Themen