2015-04-02 3 views
6

Ho creato un'app di esempio utilizzando sia i driver 1.0 e 2.0 C# per MongoDb.Come ottenere risultati dal driver MongoDb C# 2.0

Serializzano gli stessi oggetti e sono in grado di scrivere con entrambi e leggere dalla 1.0. Ma non sono in grado di usare FindAsync nel 2.0 per darmi dei risultati.

Ecco il mio 1.0 query che restituisce un documento:

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

La mia domanda 2.0 utilizzando gli stessi dati con il FindAsync assomiglia a questo:

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

Il AsyncCursor che viene restituito dal risultato è niente in esso.

results.MoveNextAsync().Wait(); // results.Current.Count = 0 

Questa potrebbe essere la mia ignoranza con asincrono e aspettano, o forse ho perso qualcosa di diverso con i metodi 2.0 find? Nota che non voglio usare lo legacy 2.0 drivers

risposta

9

La nuova API è async -non è necessario bloccarla. Non è scalabile e potrebbe portare a deadlock. Utilizzare async-await fino in fondo o continuare a utilizzare la vecchia API. In un metodo async la query dovrebbe essere simile a questo:

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

Qualche idea sul motivo per cui hanno un metodo FindAsync e un metodo Trova? Entrambi hanno un metodo FirstOrDefaultAsync su di essi. –

+3

@ runxc1BretFerrier La differenza è il valore restituito 'FindAsync' restituisce un' IAsyncCursor' mentre 'Find' restituisce' IFindFluent'. 'IFindFluent' consente di definire ulteriormente la ricerca prima di eseguirla effettivamente (ad esempio aggiungere una proiezione o un ordinamento). 'FindAsync' esegue immediatamente la query e restituisce un cursore. È possibile ottenere un cursore da 'IFindFluent' con' ToCursorAsync'. – i3arnon

+0

@ runxc1BretFerrier 'IAsyncCursor' non ha' FirstOfDefaultAsync' sebbene ... – i3arnon

2

Potete per favore provarlo?

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

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

Ho provato ad abituarmi anche alla nuova API.

+0

Ancora non è sicuro come utilizzare i metodi asincroni trovare, ma questo funziona. – paqogomez

2

O forse un po 'più elegante:

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

er non restituisce il risultato prima che l'operazione asincrona sia completata? – makhdumi