Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
C# Mongodb c驱动程序FindAll,带有设置字段和AsQueryable_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# Mongodb c驱动程序FindAll,带有设置字段和AsQueryable

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(

使用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(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))