AsQueryable方法是否在新的Mongodb C#驱动程序2.0rc中消失了?

时间:2015-03-18 14:40:40

标签: linq mongodb

首先,我是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专家的帮助。谢谢。

3 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:5)

我最初使用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();
}

希望它有所帮助。

答案 2 :(得分:0)

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

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

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