.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
相关产品推荐
相关产品推荐

