【问题标题】:C# MongoDB driver strongly typed filter usageC# MongoDB 驱动程序强类型过滤器使用
【发布时间】:2016-11-16 14:19:42
【问题描述】:

文档告诉您如何定义过滤器,但没有告诉您如何使用它。

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'

所以问题是 - 我如何使用它作为过滤器。显然过滤器参数被定义为FilterDefinition。从 BsonDocument 派生 MyItem 没有帮助。 "filter2.ToBsonDocument()" 编译但没有产生正确的结果(过滤器不工作!)。

有人能指出我正确的方向吗?
还有什么地方我可以读到?

【问题讨论】:

  • 正在使用什么驱动版本?

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

首先,我建议使用 as 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

【讨论】:

  • 感谢您将我指向 ExpressionFilterDefinition。这样可行。另外我不确定我之前是否有 _database.GetCollection**
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 2017-08-27
  • 2022-01-03
  • 1970-01-01
  • 2023-03-24
  • 2018-11-16
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多