2015-03-18 5 views
20

Prima di tutto sono nuovo in MongoDb. Nel driver 1.9.x di MongoDb C#, posso raccogliere le raccolte come interrogabili con il metodo AsQueryable come questo.Il metodo AsQueryable è partito con il nuovo driver Mongrb C# 2.0rc?

 var db = client.GetServer().GetDatabase("test"); 
     var col = db.GetCollection("Video"); 
     var qrlist = col.AsQueryable(); 

ho installato nuovo 2.0rc conducente e durante l'utilizzo, non posso utilizzare il metodo AsQueryable perché manca. È partito o c'è un altro modo per farlo? (Ho già incluso MongoDB.Driver.Linq).

 var db = client.GetDatabase("test"); 
     var col = db.GetCollection<Contact>("Contact"); //GetCollection without <T> is missing to. 
     var qrlist = col.AsQueryable(); // AsQueryable missing here. 

come posso ottenere le mie entità queryable nel nuovo driver, bisogno di aiuto da guru MongoDB. Grazie. aggiornamento

risposta

23

19 ottobre: ​​

MongoDB conducente 2.1 è fuori https://github.com/mongodb/mongo-csharp-driver/releases/tag/v2.1.0

Supporta LINQ:

LINQ

CSHARP-935 supporto LINQ è stato riscritto e ora prende di mira il quadro di aggregazione. È una traduzione più naturale e abilita molte funzionalità di LINQ che in precedenza non potevano essere tradotte.

Utilizzare semplicemente il nuovo metodo AsQueryable per lavorare con LINQ.

18 aggiornamento di settembre:

MongoDB 2.1 conducente RC dovrebbe sostenerlo. Vedi https://jira.mongodb.org/browse/CSHARP-935

Infine, 2.1 rc è uscito. Ottimo lavoro!

Vecchia risposta:

No, AsQueryable non è supportato: https://jira.mongodb.org/browse/CSHARP-935

Tipo: Epic Stato: APERTO Priorità: Major - P3 Risoluzione: non risolti

E dalla bocca dell'ora: Craig Wilson on the google forum

Sì, non c'è attualmente nessun AsQueryable sulla nuova API. È possibile tenere traccia di questa funzione qui (https://jira.mongodb.org/browse/CSHARP-935). Semplicemente non avevamo abbastanza tempo per completarlo e testarlo accuratamente. È programmato per 2.1 ed è una priorità per noi. Fino ad allora, abbiamo integrato la funzionalità della struttura di espressioni nei metodi Trova e Aggregazione (e alcuni metodi di scrittura per il filtraggio) in modo tale che non sia necessaria un'implementazione completa di LINQ. Ad esempio, vedere la classe di test di esempio qui: https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver.Tests/Samples/AggregationSample.cs#L77

+1

Mi spiace sentirlo. Grazie per la tua risposta Xanatos. –

+2

@ user1562523 Penso che sarà necessario molto tempo per il refactoring per utilizzare i driver più recenti. – xanatos

+1

Questo problema è stato aggiornato ieri nella mongo jira, quindi dovremmo vedere presto il supporto per linq. –

5

Originariamente avevo il seguente utilizzo di mongocsharp versione 1.9x:

public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate) 
{ 
    return _collection.AsQueryable<T>() 
         .Where(predicate.Compile()).AsQueryable(); 
} 

stato in grado di ottenere gli stessi risultati in versione 2 utilizza:

public async Task<List<T>> SearchFor(Expression<Func<T, bool>> predicate) 
{ 
    return await _collection.Find(Builders<T>.Filter.Where(predicate)).ToListAsync(); 
} 

Speranza che aiuta.

+0

Grazie per la risposta. Purtroppo ottenere i dati come elenco è un grosso problema di prestazioni per me. –

+0

ToListAsync è costoso. Stai violando lo scopo di IQueryable perché stai forzando un recupero impaziente di ** tutti ** i documenti nella raccolta che corrispondono. I chiamanti non possono filtrare ulteriormente a meno che non lo facciano in memoria. IQueryable è ora supportato da MongoDB.Driver, quindi è possibile restituire IQueryable e utilizzare '_collection.AsQueryable(). Where (predicato)'. Inoltre, nel tuo primo esempio, hai "AsQueryable()" due volte nella tua istruzione linq. Il .Where è già restituito come IQueryable, quindi l'ultimo AsQueryable() nel primo esempio è ridondante e non necessario. –

Problemi correlati