2016-07-13 13 views
1

Die Dokumentation zeigt Ihnen, wie Sie einen Filter definieren, aber nicht, wie Sie ihn verwenden.C# MongoDB-Treiber stark typisierte Filterverwendung

public class Widget : BsonDocument 
{ 
    [BsonElement("X")] 
    public int X { get; set; } 

    [BsonElement("Y")] 
    public int Y { get; set; } 
} 

public MyItem Get() 
{ 
    MyItem retvalue = null; 

    var builder = Builders<BsonDocument>.Filter; 
    var filter = builder.Eq("x", 10) & builder.Lt("y", 20); 
    Console.WriteLine(_collection.Count(filter)); 

    var builder2 = Builders<Widget>.Filter; 
    var filter2 = builder2.Eq(widget => widget.X, 10) & builder2.Lt(widget => widget.Y, 20); 
    Console.WriteLine(_collection.Count(filter2)); 

    return retvalue; 
} 

So ist der erste Filter arbeitet - aber es ist nicht stark typisiert.

Der zweite Filter kann nicht so verwendet werden.
Compiler-Fehler: kann nicht konvertieren von ‚MongoDB.Driver.FilterDefinition‘ auf ‚MongoDB.Driver.FilterDefinition‘

Die Frage ist also - wie verwende ich diese als Filter. Offensichtlich ist der Filterparameter als FilterDefinition definiert. MyItem von BsonDocument abzuleiten hat nicht geholfen. "filter2.ToBsonDocument()" kompiliert, liefert aber nicht das korrekte Ergebnis (Filter funktioniert nicht!).

Kann mir jemand in die richtige Richtung zeigen?
Und irgendwo kann ich darüber lesen?

+0

welche Treiberversion im Einsatz ist? – profesor79

Antwort

1

Zuerst werde ich vorschlagen, als bearbeitbar zu verwenden, was praktischer Ansatz ist, um Abfragen zu manipulieren.

_result = _collection.AsQueryable().First(w => w.X == x && w.Y < y); 

oder unter Verwendung von Expressionsfilterdefinition

_result = _collection 
      .Find(new ExpressionFilterDefinition<Widget> 
       (widget => widget.X == 10 && widget.Y < y)) 
      .First() 

Vollversion auf github

C# Treiber Referenz here

+0

Vielen Dank, dass Sie mich auf ExpressionFilterDefinition verwiesen haben. Das funktioniert. Ich bin mir auch nicht sicher, ob ich vorher _database.GetCollection * * hatte – lapsus

Verwandte Themen