2012-03-28 4 views
0

Ich bin die offizielle MongoDB C# TreiberIst "Fields.Include" erforderlich, wenn benutzerdefinierte Felder in einer Auswahl definiert werden?

So verwenden habe ich diesen Code

MongoCollection<MyClass> collection = ...; 
var cursor = collection.FindAll(); 
cursor.Fields = Fields.Include("LastModified", "Name"); 
foreach (var result in cursor.Select(y => new 
    { 
     y.Name, 
     y.LastModified, 
    })) 

Ich möchte wissen, ob cursor.Fields = Fields.Include("LastModified", "Name"); erforderlich ist, wenn diese Felder defiend als Teil wählen zu sein. d. h. ist der linq-Provider für mongodb intelligent genug, um die Abfrage zu optimieren?

Antwort

0

Es gibt zwei Teile auf die Antwort:

Erstens, die LINQ-Implementierung in der 1.4 Version von C# Fahrer versucht nicht, die Felder vom Server zurück zu begrenzen. Das gesamte Dokument wird immer zurückgegeben, auch wenn eine Projektion später nur einen Teil davon verwendet. Wir planen, dies in zukünftigen Versionen zu optimieren, aber es ist nicht so einfach wie es klingt.

Zweitens verwenden Sie tatsächlich keine LINQ-Abfrage, zumindest nicht eine LINQ to MongoDB-Abfrage. Während Ihr Code geschrieben wird, holen Sie die gesamte Sammlung zum Client (das ist, was FindAll tut) und verwenden dann Lokal auswählen gegen die abgerufenen Werte. Eine ähnliche LINQ-Abfrage für MongoDB würde wie folgt geschrieben werden:

var query = from y in collection.AsQueryable<MyClass>() 
      select new { y.Name, y.LastModified }; 
foreach (var result in query) 
{ 
    // process result 
} 
+0

kein AsQueryable auf MongoCollection ist – Simon

+0

Es ist in der neuen 1.4 Release der 28. März gerade veröffentlicht wurde. –

Verwandte Themen