4

使用 MongoDB C# 驱动程序,我似乎无法通过 AsQueryable 和 setFields 获取数据,而 Where 条件只能通过 mongo 查询。我通过这段代码获取了文件

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 查询。谁能解释一下如何正确地做到这一点?

4

1 回答 1

5

您使用 .AsQueryable()from System.Linq,因此它会过滤客户端的所有内容。但是您需要使用.AsQueryable()fromMongoCollection来过滤数据库中的数据。此扩展方法创建MongoQueryable<T>.

我相信以下应该有效:

//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();

更新:

如果你想使用SetFields你必须使用旧的查询语法:

_col.Find(Query<UserDocument>.EQ(x=> x.Name, "Ken")).SetFields(..). 

您也可以使用不带魔术字符串的 SetFields,如下所示:

cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))

使用 linq SetFields 是通过Select.

希望这可以帮助。

于 2012-12-19T08:40:44.627 回答