无法在 MongoDb 集合查询中将 ObjectId 反序列化为 String
Can't deserialize from ObjectId to String in a MongoDb collection query
每当我尝试从集合中获取 ID 列表时:
var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
.AsQueryable()
.Where(_=> true)
.Select(x => x.Id)
.ToList();
我遇到一个转换错误:
System.FormatException HResult=0x80131537 Message=Cannot
deserialize a 'String' from BsonType 'ObjectId'. Source= StackTrace:
我无法修改 class 的定义,因为它在我无法更改的包中实现。因此解决方案:
[BsonRepresentation(BsonType.ObjectId)]
在上面,不可能。基于 this.
是否可以在 Linq 查询中转换它?
您绝不一定要使用包中的内容 - 如果您知道 class 的定义是什么,我建议您在项目中使用自己的 MessageExchange
并使用它来使用驱动程序查询集合。
这还允许您只获取所需的字段(在新的 class 上使用 [BsonIgnoreExtraElements]
属性),而不是包的作者强加给您的字段。
如果使用 MessageExchange
类型对于您的程序流程和结构来说是绝对必要的,我建议您使用 AutoMapper 之类的东西从您自己的类型转换回原始类型。
否,因为 db.GetCollection<MessageExchange>
将集合定义为强类型对象,驱动程序将结合执行的任何进一步逻辑(使用 linq 或其他方式)对其进行处理。
您最好的选择是:
在您自己的代码中定义一个与您的 Mongo 集合兼容的 class,然后使用该 class 反序列化您的结果 db.GetCollection<MyCustomMessageExchange>
然后您可以将其与上面的 linq 查询一起使用 select 只是 ids.
只需使用默认值 BsonDocument
来定义您的集合并使用投影:
db.GetCollection<BsonDocument>.Find(new BsonDocument()).Project("{_id: 1}").ToList()
ObjectId structure implements a ToString 方法,允许您将对象转换为其字符串表示形式。
所以我认为你可以这样做:
var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
.AsQueryable()
.Where(_=> true)
.Select(x => x.Id.ToString())
.ToList();
每当我尝试从集合中获取 ID 列表时:
var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
.AsQueryable()
.Where(_=> true)
.Select(x => x.Id)
.ToList();
我遇到一个转换错误:
System.FormatException HResult=0x80131537 Message=Cannot deserialize a 'String' from BsonType 'ObjectId'. Source= StackTrace:
我无法修改 class 的定义,因为它在我无法更改的包中实现。因此解决方案:
[BsonRepresentation(BsonType.ObjectId)]
在上面,不可能。基于 this.
是否可以在 Linq 查询中转换它?
您绝不一定要使用包中的内容 - 如果您知道 class 的定义是什么,我建议您在项目中使用自己的 MessageExchange
并使用它来使用驱动程序查询集合。
这还允许您只获取所需的字段(在新的 class 上使用 [BsonIgnoreExtraElements]
属性),而不是包的作者强加给您的字段。
如果使用 MessageExchange
类型对于您的程序流程和结构来说是绝对必要的,我建议您使用 AutoMapper 之类的东西从您自己的类型转换回原始类型。
否,因为 db.GetCollection<MessageExchange>
将集合定义为强类型对象,驱动程序将结合执行的任何进一步逻辑(使用 linq 或其他方式)对其进行处理。
您最好的选择是:
在您自己的代码中定义一个与您的 Mongo 集合兼容的 class,然后使用该 class 反序列化您的结果
db.GetCollection<MyCustomMessageExchange>
然后您可以将其与上面的 linq 查询一起使用 select 只是 ids.只需使用默认值
BsonDocument
来定义您的集合并使用投影:db.GetCollection<BsonDocument>.Find(new BsonDocument()).Project("{_id: 1}").ToList()
ObjectId structure implements a ToString 方法,允许您将对象转换为其字符串表示形式。
所以我认为你可以这样做:
var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
.AsQueryable()
.Where(_=> true)
.Select(x => x.Id.ToString())
.ToList();