2016-12-22 2 views
-1

Wir aktualisieren derzeit eine ältere Version des Mongo-Treibers auf den 2.x-Treiber. Ich versuche, den Code, den wir vorher hatten, zu aktualisieren, aber ich habe Mühe, herauszufinden, wie.Von Slice (Projektion) abgeleitetes Klassenarray mit MongoDB C# -Treiber (v2.4)

Unsere Klassenstruktur ist ein bisschen wie folgt aus:

public class BaseClass 
{ 
    public string Name { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public IEnumerable<DataClass> Items { get; set; } 
} 

public class DataClass 
{ 
    public string Element1 { get; set; } 
    public string Element2 { get; set; } 
} 

Mit dem alten Treiber, die wir Code wie folgt hatte:

var result = collection 
       .Find(query) 
       .SetLimit(10) 
       .SetFields(Fields.Slice("Items", 0, 1)); 

Und mit dem neuen wir Code wie dieses:

var result = collection 
       .Find(query) 
       .Limit(10) 
       .Project<BaseClass>(...); 

In unserem Fall repräsentieren die Daten Benutzerkommentare und es kann zwei Arten geben. Unser query Objekt ist Code, um Paging zu behandeln. Für den abgeleiteten Typ möchte ich nur das erste Element im Items-Array zurückgeben. Wir müssen alle übereinstimmenden Kommentare zusammengeben.

Das Problem, mit dem ich konfrontiert bin, ist, dass Project statisch typisiert ist und daher Builders<BaseClass>.Projection.___ erwartet. Die IFindFluent<BaseClass, BaseClass> hat eine As<T> Option, aber dann ist die erwartete Projektion ProjectionDefinition<BaseClass, DerivedClass>, und ich kann keine Möglichkeit sehen, ein solches Definitionsobjekt zu erstellen - selbst nach einem kurzen Blick auf den Mongo-Treiber.

Gibt es eine einfache Möglichkeit, dies zu tun?

+0

Ich bin mir nicht sicher, warum jemand das abgelehnt hat. Wenn etwas mit den älteren Mongo-Treibern nicht möglich war, erwarten Sie nicht, dass es plötzlich mit den neueren Mongo-Treibern möglich wird. – john

Antwort

0

Es scheint, dass ich nicht logisch darüber nachgedacht habe.

Mit dem neuen Treiber, es scheint, alles, was ich tun muss, ist die Verwendung als Operator oder vermutlich eine Standard-Besetzung, und ich bin in der Lage, das richtige Feld zu finden.

var result = collection 
       .Find(query) 
       .Limit(10) 
       .Project<BaseClass>(d => (d as DerivedClass).Items, 1); 

Das war nicht mit dem älteren Fahrer gearbeitet, so habe ich es mit dem neuen nicht versuchen zu denken.

Verwandte Themen