Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 在新的Mongodb C#驱动程序2.0rc中是否有可查询的方法?_Linq_Mongodb - Fatal编程技术网

Linq 在新的Mongodb C#驱动程序2.0rc中是否有可查询的方法?

Linq 在新的Mongodb C#驱动程序2.0rc中是否有可查询的方法?,linq,mongodb,Linq,Mongodb,首先,我是MongoDb的新手。在MongoDb C#driver 1.9.x中,我可以使用如下AsQueryable方法将集合作为可查询的 var db = client.GetServer().GetDatabase("test"); var col = db.GetCollection("Video"); var qrlist = col.AsQueryable(); 我安装了新的驱动程序2.0rc,在使用它时,我无法使用AsQueryab

首先,我是MongoDb的新手。在MongoDb C#driver 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(“测试”);
var col=db.GetCollection(“联系人”)//没有的GetCollection缺少到。
var qrlist=col.AsQueryable();//这里不见了。

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

10月19日更新:

MongoDB 2.1驱动程序已退出

它支持LINQ:

林克

CSHARP-935 LINQ支持已被重写,现在以聚合框架为目标。这是一种更自然的翻译,可以实现以前无法翻译的LINQ的许多功能

只需使用新的AsQueryable方法来处理LINQ

9月18日更新:

MongoDB 2.1驱动程序RC应该支持它。看

最终,2.1 rc出现了。干得好

旧答案:

否,不支持AsQueryable:

类型:史诗 状态:打开 优先:专业-P3 决议:未解决

从霍斯的嘴里:

是的,新api上目前没有可查询的内容。您可以在此处跟踪此功能()。我们只是没有足够的时间来完成和彻底测试。它被安排在2.1版,是我们的优先事项。在此之前,我们已经将表达式树功能集成到Find和Aggregate方法(以及一些用于过滤的write方法)中,因此您可能不需要完整的LINQ实现。例如,请参见此处的示例测试类:


我最初使用mongocsharp版本1.9x时有以下功能:

public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate)
{
    return _collection.AsQueryable<T>()
                      .Where(predicate.Compile()).AsQueryable();
}
publicIQueryable搜索(表达式谓词)
{
return _collection.AsQueryable()
.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();
}
公共异步任务搜索(表达式谓词)
{
return wait_collection.Find(Builders.Filter.Where(谓词)).ToListAsync();
}

希望能有所帮助。

而其他答案表明早期版本2的驱动程序没有包含
AsQueryable
,这现在在最新版本的驱动程序中可用(我还没有检查到底是哪个版本引入了它)

该方法可以在
MongoDB.Driver.IMongoCollectionExtensions
中找到,并且可以按预期调用。即:

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

听到这个消息我很难过。谢谢你的回答,Xanatos。@user156523我认为使用更新的驱动程序需要进行很多重构。这个问题昨天在mongo jira上更新了,所以我们很快就会再次看到对linq的支持。好消息。谢谢..AsQueryable现在似乎在MongoDB.Driver 2.4.3中可用。我能够为“MongoDB.Driver.Linq”添加一个using,然后我能够使用以下语法使用iQueryable访问我的集合:
\u collection.AsQueryable().Where(谓词)哦-我注意到上面已经解释过了,我只是看错了评论。谢谢你的回答。不幸的是,以列表形式获取数据对我来说是一个很大的性能问题。ToListSync很昂贵。您违反了IQueryable的目的,因为您强制对集合中匹配的所有文档进行急切检索。调用者不能进一步筛选,除非他们在内存中这样做。现在MongoDB.Driver支持IQueryable,因此您可以返回IQueryable并使用
\u collection.AsQueryable().Where(谓词)
。另外,在第一个示例中,linq语句中有两次“AsQueryable()”。.Where已作为IQueryable返回,因此第一个示例中的最后一个AsQueryable()是多余的,不必要的。
IMongoCollection<TDocument> collection = ...;
IMongoQueryable<TDocument> queryable = collection.AsQueryable();