Mongodb:Fail 通过 ObjectID 获取 GridFSFileInfo,但通过文件名获取成功
Mongodb:Fail to get GridFSFileInfo by ObjectID, but succeed by filename
我无法通过 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 方法。
任何建议将不胜感激......
谢谢
Unable to determine the serialization information for x=>x.Id
如错误所示,您不能以这种方式在查询中使用 x.Id。提供的 lambda 表达式用于检索 属性 的名称,它不理解 x.Id 是什么。
你可以试试这个:
var filter = Builders<GridFSFileInfo>.Filter.Eq("_id", gridfsObjectID);
它使用 this overload of the Eq method and performs the implicit conversion 从 String 到 FieldDefinition。
表达式对我来说也有点令人费解,但您可以在这个问题的答案中找到更多与表达式相关的信息:Why would you use Expression> rather than Func?
您可以直接在 Find 方法中添加 lambda 语法:
myBucket.FindAsync(x => x.Id == new MongoDB.Bson.ObjectId(objectID), findOptions)
我无法通过 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 方法。 任何建议将不胜感激...... 谢谢
Unable to determine the serialization information for x=>x.Id
如错误所示,您不能以这种方式在查询中使用 x.Id。提供的 lambda 表达式用于检索 属性 的名称,它不理解 x.Id 是什么。
你可以试试这个:
var filter = Builders<GridFSFileInfo>.Filter.Eq("_id", gridfsObjectID);
它使用 this overload of the Eq method and performs the implicit conversion 从 String 到 FieldDefinition。
表达式对我来说也有点令人费解,但您可以在这个问题的答案中找到更多与表达式相关的信息:Why would you use Expression> rather than Func?
您可以直接在 Find 方法中添加 lambda 语法:
myBucket.FindAsync(x => x.Id == new MongoDB.Bson.ObjectId(objectID), findOptions)