2016-07-13 2 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; 
} 

Таким образом, первый фильтр работает - но это не сильно типизированных.

Второй фильтр не может использоваться так.
Compiler ошибка: не может конвертировать из «MongoDB.Driver.FilterDefinition» до «» MongoDB.Driver.FilterDefinition

Таким образом, вопрос - как я могу использовать это в качестве фильтра. Очевидно, что параметр фильтра определяется как FilterDefinition. Получение MyItem из BsonDocument не помогло. «filter2.ToBsonDocument()» компилируется, но не дает правильного результата (фильтр не работает!).

Может кто-нибудь указать мне в правильном направлении?
И какое-то место я могу прочитать об этом?

+0

какая версия драйвера используется? – profesor79

ответ

1

Сначала я предлагаю использовать как запрошенный, который является удобным подходом к манипулированию запросами.

_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

Смежные вопросы