【问题标题】:Mongodb:Fail to get GridFSFileInfo by ObjectID, but succeed by filenameMongodb:无法通过ObjectID获取GridFSFileInfo,但通过文件名成功
【发布时间】:2015-11-03 09:12:34
【问题描述】:

我无法通过 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# driver 2.1,wird Tiger 存储引擎。 请原谅我使用了许多“Task.Run()”,因为出于某种原因我需要同步调用异步 mongo 方法。 任何建议将不胜感激... 谢谢

【问题讨论】:

    标签: c# mongodb gridfs


    【解决方案1】:

    无法确定 x=>x.Id 的序列化信息

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

    你可以试试这个:

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

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

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

    【讨论】:

    • 有效!谢谢上面的答案和其他信息。尽管它们对我来说似乎有点困难(尤其是 Eq 的链接和隐式转换)。我会花一些时间在他们身上。再次感谢。
    【解决方案2】:

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

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

    【讨论】:

    • 我试过这个并得到编译错误。错误消息:无法将 lambda 表达式转换为 MongoDB.Driver.FilterDefinition,因为它不是委托。这是 FindAsync:link 的 api。 FindAsync 似乎不接受 lambda 表达式参数。
    猜你喜欢
    • 2018-05-22
    • 2014-10-11
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多