C# Mongodb c驱动程序FindAll,带有设置字段和AsQueryable
使用MongoDB C驱动程序,似乎我无法通过AsQueryable和setFields获取数据,并且只能通过mongo查询获取Where条件。我通过这个代码获取文档C# Mongodb c驱动程序FindAll,带有设置字段和AsQueryable,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,使用MongoDB C驱动程序,似乎我无法通过AsQueryable和setFields获取数据,并且只能通过mongo查询获取Where条件。我通过这个代码获取文档 var query = _collection.FindAll().SetFields(fields.MongoFieldsBuilder).AsQueryable(); var query1 = query.Where(d=>d.Name="Ken").ToList(); var query2 = query.Where(
var query = _collection.FindAll().SetFields(fields.MongoFieldsBuilder).AsQueryable();
var query1 = query.Where(d=>d.Name="Ken").ToList();
var query2 = query.Where(d=>d.Age>=2).ToList();
所以,当执行query1或query2时,c驱动程序从mongo获取所有文档,然后在内存中对其进行过滤。但我预计Where条件将转换为带有字段的mongo查询。
有人能解释一下如何正确操作吗?您正在使用System.Linq中的.AsQueryable,因此它会过滤客户端的所有内容。
但您需要使用MongoCollection中的.AsQueryable来过滤数据库中的数据。此扩展方法创建MongoQueryable
我认为以下几点应该有效:
//or you could use your projection class instead of BsonDocument
var query = Items.AsQueryable<BsonDocument>()
.Select(x=> new {id = x["_id"].AsObjectId, Name=x["Name"].AsString});
var query1 = query.Where(d=>d.Name == "Ken").ToList();
您还可以使用不带魔术字符串的设置字段,如下所示:
cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))
linq设置字段通过选择完成
希望这有帮助。是的,但如果我可以创建不带魔力字符串的查询或使用魔力字符串选择,那会更好,因为我想将mongocsharpdriver字段生成器与设置字段一起使用。如果你想使用设置字段,你必须使用旧的查询语法:_col.FindQuery.EQx=>x.Name,Ken.SetFields。。。linq设置字段通过选择完成。这似乎是你想要的。没有神奇的字符串:Andrew,正如我所写的,我想在设置字段中使用Linq条件。我认为有可能向mongocsharpdriver LinqExtension添加带有参数IFields的AsQueryable方法,这将是一个更灵活的解决方案。不,您目前无法执行任何操作。上面Andrew的答案可以使用linq进行查询。其中x=>x.Name==Ken。然后可以使用字段生成器设置字段。但是,您可能使用设置字段仅提取数据的一个子集。这在linq提供程序中目前是不可能的。有一个问题需要解决:您的示例中的项目类型是什么?我得到MongoCursor,如何在IQueryable中转换它?
cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))