You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中GridFSFileInfo.Id查询文件信息报错求助

解决GridFSFileInfo.Id查询抛出ExpressionNotSupportedException的问题

问题场景

从GridFS数据库获取GridFSFileInfo时,使用过时的IdAsBsonValue属性查询可正常运行,但改用Id属性时会抛出MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression not supported: x.Id.错误,环境为.NET 6.0。

原可用代码(依赖过时属性):

var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.IdAsBsonValue, BsonValue.Create(ObjectId.Parse(id)));

using (var cursor = _bucket.Find(filter))
{
    var fileInfo = cursor.ToList().FirstOrDefault();
    // ...
}

改用Id属性后报错的代码:

var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Id, ObjectId.Parse(id));

原因分析

MongoDB驱动的表达式解析器暂不支持直接访问GridFSFileInfo.Id属性构建查询过滤器,该属性的泛型类型映射未被驱动的表达式树处理逻辑兼容。而IdAsBsonValue因直接对应文档中的_id字段,能被解析但已标记为过时。

解决方案

方案1:直接使用_id字段名构造过滤器

这是最简洁的方式,直接指定MongoDB文档原生字段名:

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

using (var cursor = _bucket.Find(filter))
{
    var fileInfo = cursor.ToList().FirstOrDefault();
    // ...
}

方案2:使用BsonDocumentFilterDefinition构造过滤器

若偏好强类型文档定义方式,可基于BsonDocument直接构建过滤器:

var filter = new BsonDocumentFilterDefinition<GridFSFileInfo>(new BsonDocument("_id", ObjectId.Parse(id)));

using (var cursor = _bucket.Find(filter))
{
    var fileInfo = cursor.ToList().FirstOrDefault();
    // ...
}

内容的提问来源于stack exchange,提问作者don_kondon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:42:16