Mongodb:无法通过ObjectID获取GridFSFileInfo,但是通过filename成功

时间:2015-11-03 09:12:35

标签: c# mongodb gridfs

我无法通过ObjectID获取GridFSFileInfo,但是通过文件名成功, 并且错误消息是: 无法确定x => x.Id

的序列化信息
string objectID = ObjectIDTxt.Text.Trim();
GridFSBucketOptions bucketOptions = new GridFSBucketOptions();
bucketOptions.BucketName = "myBucket";

ObjectId gridfsObjectID = new ObjectId(objectID);

//by filename will succeed
//var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, "myfilename.pdf");
//by ObjectID will fail
var filter = Builders<GridFSFileInfo>.Filter.Eq(x=>x.Id,gridfsObjectID);

var findOptions = new GridFSFindOptions();
findOptions.Limit = 1;

var myBucket = new GridFSBucket(_database, bucketOptions);

using (var taskOfCursor = Task.Run(() => myBucket.FindAsync(filter, findOptions)))
{   
    var taskOfList = Task.Run(() => taskOfCursor.Result.ToListAsync());
    GridFSFileInfo fileInfo = taskOfList.Result.FirstOrDefault();
    if (fileInfo != null)
    {
        FileNameLbl.Text = fileInfo.Filename;
    }
}

我使用Mongodb 3.0,c#驱动程序2.1,wird tiger存储引擎。 请原谅我使用了很多“Task.Run()&#39;”,因为出于某种原因我需要同步调用async mongo方法。 任何建议将不胜感激...... THX

2 个答案:

答案 0 :(得分:8)

  

无法确定x =&gt; x.Id

的序列化信息

如错误所示,您不能以这种方式在查询中使用x.Id。提供的lambda表达式用于检索属性的名称,但它不了解x.Id是什么。

你可以试试这个:

var filter = Builders<GridFSFileInfo>.Filter.Eq("_id", gridfsObjectID);

使用this overload方法的Eq并从String到FieldDefinition执行the implicit conversion

表达式对我来说似乎有点令人费解,但您可以在此问题的答案中找到与表达式相关的更多信息:Why would you use Expression> rather than Func?

答案 1 :(得分:0)

您可以直接在Find方法中添加lambda语法:

myBucket.FindAsync(x => x.Id == new MongoDB.Bson.ObjectId(objectID), findOptions)