【问题标题】:Is AsQueryable method departed in new Mongodb C# driver 2.0rc?AsQueryable 方法是否在新的 Mongodb C# 驱动程序 2.0rc 中离开?
【发布时间】:2021-01-21 16:37:32
【问题描述】:

首先,我是 MongoDb 的新手。在 MongoDb C# 驱动程序 1.9.x 中,我可以使用这样的 AsQueryable 方法将集合作为可查询的。

        var db = client.GetServer().GetDatabase("test");
        var col = db.GetCollection("Video");
        var qrlist = col.AsQueryable();

我安装了新的驱动程序 2.0rc,在使用它时,我无法使用 AsQueryable 方法,因为它丢失了。它已经离开还是有其他方法可以实现这一目标? (我已经包含了 MongoDB.Driver.Linq)。

        var db = client.GetDatabase("test");
        var col = db.GetCollection<Contact>("Contact"); //GetCollection without <T> is missing to.
        var qrlist = col.AsQueryable(); // AsQueryable missing here.

如何让我的实体在新驱动程序中可查询,需要 MongoDb 专家的帮助。谢谢。

【问题讨论】:

    标签: linq mongodb


    【解决方案1】:

    10 月 19 日更新:

    MongoDB 2.1 驱动程序已发布https://github.com/mongodb/mongo-csharp-driver/releases/tag/v2.1.0

    支持 LINQ:

    LINQ

    CSHARP-935 LINQ 支持已被重写,现在针对聚合框架。它是一种更自然的翻译,并启用了以前无法翻译的 LINQ 的许多功能。

    只需使用新的 AsQueryable 方法即可使用 LINQ。

    9 月 18 日更新:

    MongoDB 2.1 驱动程序 RC 应该支持它。见https://jira.mongodb.org/browse/CSHARP-935

    2.1 rc 终于出来了。干得好!

    旧答案:

    不,不支持 AsQueryable:https://jira.mongodb.org/browse/CSHARP-935

    类型:史诗 状态:开放 优先级:主要 - P3 分辨率:未解决

    从小时的口中:Craig Wilson on the google forum

    是的,新 api 上目前没有 AsQueryable。您可以在此处跟踪此功能 (https://jira.mongodb.org/browse/CSHARP-935)。我们根本没有足够的时间来完成它并进行彻底的测试。它计划用于 2.1,是我们的优先事项。在那之前,我们已经将表达式树功能集成到 Find 和 Aggregate 方法(以及一些用于过滤的写入方法)中,这样您可能不需要完整的 LINQ 实现。例如,这里以示例测试类为例:https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver.Tests/Samples/AggregationSample.cs#L77

    【讨论】:

    • 很抱歉听到这个消息。感谢您的回答 Xanatos。
    • @user1562523 我认为需要进行大量重构才能使用较新的驱动程序。
    • 这个问题昨天在 mongo jira 中更新,所以我们应该很快就会再次看到对 linq 的支持。
    • 好消息。谢谢。
    • .AsQueryable 似乎现在可用于 MongoDB.Driver 2.4.3 我能够为“MongoDB.Driver.Linq”添加一个使用,然后我能够使用 IQueryables 访问我的集合以下语法:_collection.AsQueryable().Where(predicate); 哦 - 我注意到上面已经解释过了,我只是看错了评论。
    【解决方案2】:

    我最初使用 mongocsharp 1.9x 版本有以下内容:

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return _collection.AsQueryable<T>()
                          .Where(predicate.Compile()).AsQueryable();
    }
    

    能够在第 2 版中使用以下方法获得相同的结果:

    public async Task<List<T>> SearchFor(Expression<Func<T, bool>> predicate)
    {
        return await _collection.Find(Builders<T>.Filter.Where(predicate)).ToListAsync();
    }
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答。不幸的是,将数据作为列表获取对我来说是一个很大的性能问题。
    • ToListAsync 很昂贵。您违反了 IQueryable 的目的,因为您正在强制检索集合中匹配的 all 文档。调用者不能进一步过滤,除非他们在内存中进行。 MongoDB.Driver 现在支持 IQueryable,因此您可以返回 IQueryable 并使用 _collection.AsQueryable().Where(predicate)。此外,在您的第一个示例中,您的 linq 语句中有两次“AsQueryable()”。 .Where 已经作为 IQueryable 返回,因此第一个示例中的最后一个 AsQueryable() 是多余且不必要的。
    【解决方案3】:

    虽然其他答案表明驱动程序的早期版本 2 不包括 AsQueryable,但现在可以在最新版本的驱动程序中使用它(我没有确切检查是哪个版本引入了它)。

    该方法在MongoDB.Driver.IMongoCollectionExtensions 中找到,可以按照您的预期调用。那就是:

    IMongoCollection<TDocument> collection = ...;
    IMongoQueryable<TDocument> queryable = collection.AsQueryable();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多