na1*_*a1s 4 c# mongodb mongodb-.net-driver
使用MongoDB C#驱动程序,似乎我无法使用setFields通过AsQueryable获取数据,而只能通过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();
Run Code Online (Sandbox Code Playgroud)
因此,当query1或query2执行时,c#driver从mongo中获取所有文档,然后在内存中过滤它.但我预计Where条件将转换为带字段的mongo查询.任何人都可以解释如何正确地做到这一点?
您使用 .AsQueryable()from System.Linq,因此它会过滤客户端的所有内容.但是您需要使用.AsQueryable()from MongoCollection来过滤数据库中的数据.此扩展方法创建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();
Run Code Online (Sandbox Code Playgroud)
更新:
如果要使用SetFields,则必须使用旧的查询语法:
_col.Find(Query<UserDocument>.EQ(x=> x.Name, "Ken")).SetFields(..).
Run Code Online (Sandbox Code Playgroud)
您也可以使用没有魔术字符串的SetFields,如下所示:
cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))
Run Code Online (Sandbox Code Playgroud)
使用linq SetFields完成Select.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
6009 次 |
| 最近记录: |