我无法通过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()',因为某些原因,我需要同步调用异步mongo方法。
任何建议将不胜感激...
谢谢

最佳答案



正如错误所暗示的那样,您不能以这种方式在查询中使用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?

关于c# - Mongodb:无法通过ObjectID获取GridFSFileInfo,但是通过文件名成功,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33495208/

10-12 17:30
查看更多