2016-07-13 81 views
1

文檔告訴您如何定義過濾器,但不知道如何使用它。C#MongoDB的驅動強類型的過濾器的使用

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; 
} 

所以第一個過濾器正在工作 - 但它是強類型。

第二過濾器不能使用這樣的。
編譯器錯誤:無法從「MongoDB.Driver.FilterDefinition」到「MongoDB.Driver.FilterDefinition」

轉換所以,問題是 - 我怎麼用這個作爲一個過濾器。顯然,filter參數被定義爲FilterDefinition。從BsonDocument派生MyItem沒有幫助。 「filter2.ToBsonDocument()」編譯但不會產生正確的結果(過濾器不工作!)。

有人能指出我到正確的方向?
還有一些我可以讀到的地方?

+0

什麼驅動程序版本正在使用完整版? – profesor79

回答

1

首先,我會建議爲querable這是操縱查詢方便的方法來使用。

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

或使用表達式過濾器定義

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

github

C#驅動器參考here

+0

感謝您將我指向ExpressionFilterDefinition。這樣可行。此外,我不知道如果我有_database.GetCollection * *之前 – lapsus

相關問題